Skip to main content

Full text of "Shiva - Games to play on your Oric"

See other formats







Games to Play 
on Your Oric-! 


Games to Play 
on Your Oric-l 


C7zes Kosniowski 


University of Neweastie Upon fyne 





Vi 
Shiva Publishing Limited 


SHIVA PUBLISHING LIMITED 
4 Church Lane, Nantwich, Cheshire CW5 5RQ, England 


© Czes Kosniowski, 1983 
ISBN 0 906812 48 8 


All rights reserved. No part of this publication may be reproduced, stored in a 
retrieval system, or transmitted in any form or by any means, electronic, mechanical, 
photocopying, recording and/or otherwise, without the prior written permission of 
the Publishers. 


This book is sold subject to the Standard Conditions of Sale of Net Books and may 
not be resold in the UK below the net price given by the Publishers in their current 
price list. 


Typeset by the author using an ACT Sirius 1 microcomputer 
and printed by Devon Print Group, Exeter 


Contents 


Preface 

Treasure hunt 
Don’t cry wolf 
Moon landing 
Bird and caterpillar 
Twenty-five squares 
Intelligence test? 
Hypnotic 
Dancing men 
Graphics show 
Square nim 

Oh! Susanna 
Stop ‘em 

Round and round 
Cascade 

La Cucaracha 
Clock puzzle 
Blank out 
Surfaces 

Blue Danube 
Snake 

Space chase 

Spell it 

Sketch pad 
Bounce away 
Spirals 

Knees up Mother Brown! 
Memory cards 
Hangman 

Figure it out 
Don’t be greedy 


VVURRPPHRPEBRRESE Ran eoepos 
OONDATIP W ROOMNADTUPWNRFPOOMANDUPLWNFH 


w 
So 


Appendix 1: Saving screen to tape 
Appendix 2: Renumber utility 
Appendix 3: The ORIC characters 
Appendix 4: Musical notes 


13 
18 
23 
29 


36 
39 
43 
47 
49 
52 
55 
59 
62 
67 
70 
73 
75 
79 


89 
92 
94 


104 
109 
113 


118 
120 
125 
127 


Preface 


In this book you'll find many new and exciting programs for your ORIC. 
Some are games, while others are purely entertainment (using sound and 
graphics). The games vary in nature. Dancing men, for example, is of the 
arcade type, relying on you to respond quickly and accurately. With some of 
the games you can take your time and exercise your mind a little bit. For 
example, in Don’t cry wolf you are chased by a pack of wolves. You can 
outwit them if you think about your moves. And there’s no hurry; the 
wolves don’t move until you’ve made your move. The third type are like 
puzzles, in which you have to rearrange various bits and pieces. 

The program listings are printed directly from bug-free RUNning programs. 
Each program is accompanied by notes describing the general purpose of 
the program. Usually a sample screen print-out is included to give an idea of 
what to expect from the program. In addition, brief descriptions of the main 
routine and the various subroutines are included to help you understand 
the way each program works. 

Each program has been written in a style which should enable you to see 
the program as a whole. The BASIC word G0TO is not used in any program. 
Excessive use of this word tends to make a program difficult to understand, 
and leads to what is commonly referred to as spaghetti programming. It is 
relatively easy to avoid using GOTO on the ORIC computer, the programs in 
this book provide the evidence. 

All GOSUB statements are of the form GOSUB BLANK, where the variable 
BLANK is assigned a value in the first few lines of the program. This makes it 
easy to renumber the lines of the program. A short renumber utility 
program is given in the appendices, you can add this to the end of your 
programs if you wish. 

Be careful when you type in a program; be particularly careful with colons 
and semicolons, with the number 1 and the letter I and finally with the 
number 0 and the letter 0. When you have typed out a program you should 
CSAVE it before trying to RUN it; just in case you have made a typing error. 
All the programs are bug-free; thus if a SYNTAX ERROR occurs you should 
carefully compare your program with the listing in this book. Please note that 
the spaces in the program listings are for clarity only, they need not be typed in. 

Care has been taken to ensure that all the programs are robust. 
Consequently they shouldn’t crash if an incorrect key is pressed. For 
example, if a program is expecting a number and you type in a letter by 
mistake then the program will not crash! 

The programs have been thoroughly tested by Ann, Kora and Inga as well 


as by several unsuspecting visitors. Many thanks to them all for being 
guinea-pigs and for making many valuable comments. Many thanks also to 
Kathleen McCaffrey who managed to convert my scratchings into readable 
text using an ACT Sirius 1 microcomputer. 


Czes Kosniowski 
Newcastle upon Tyne, June 1983 


I freasure Hunt 


This is a simple game in which you have to find the whereabouts of some 
hidden treasure. There are a number of bushes neatly displayed on your 
screen. The treasure is hidden under one of these. You are at the bush that is 
flashing and you can move from bush to bush by using the cursor keys. By 
pressing the space bar your ORIC will tell you approximately how far away 
you are from the treasure. Approximately, because the number displayed is 
the INTegral part of the distance between you and the treasure. 

To confuse you, the ORIC will occasionally print a question mark instead 
of the distance. Furthermore, if the distance is 10 or more then an X is 
printed. 

There is no limit to the number of guesses that you are allowed, but try to 
find the treasure in about 3 attempts! 


TREASURE 
# 7 # 
4 


“J 
bh 


te 
ae 


J _ 


+tet ett + + + 
eet HOU SS 
+e e+ HH HH H H+ + 
++teteetet e+ HH 
JT ttt +e +e te +H HH + 
+e H+ HHH HH + + + 
a a ee a a 
JT tet HE << + HE H+ + 
i a a 


# 
2 
2 
3 
# 
# 
# 
# 
# 
# 


# tH Ht H+ HF FP 

+e eEHHHHHAHe ££ -) 
+eeHteteHetet ete Hee 
+tHHHEHA HH HH 


Ess 
SE 


# 
Use the cursor keys to move. 
Press the <Space bar? to view. 





18 R 
28 R 
38 R 
48 R 
58 V 
100 
118 
128 
130 
148 
158 
148 
170 
188 
198 
200 
218 
220 
238 
248 
258 
268 
508 
510 
526 
538 
548 
558 
568 
578 
1080 
1018 
1820 
“1038 
1848 
1858 
1868 
1870 
1888 
1898 
1108 


EM HEHEHE R ERE EERE HEE 
EM * TREASURE HUNT # 
EM HHERHHHHHHEE HERES 
EM 

TEW=500: SETUP=1080: INFO=2008 
REM * THE MAIN PROGRAM * 
GOSUB INFO:GOSUB SETUP 
REPEAT 

: PLOT X,¥,12:GET K#:KK=ASC(K$):PLOT X,Y,8 
: IF KK=32 THEN GOSUB VIEW 

: IF KK=8 AND X>4 THEN X=X-2 

: IF KK=9 AND X<3@ THEN X=X+2 

: IF KK=1@ AND Y<22 THEN Y=Y+2 

: IF KK=ii AND Y>2 THEN Y=Y-2 
UNTIL STATE 
SHOOT: WAIT 4@:PING:WAIT 48:PING 
PRINT CHR$(14)+E$+"L"3SPC(11)3; "WELL DONE" 
PRINT E$t+"A"+" Another go? Y or N" 
PRINT CHR$(14)+CHR$(11)5:PING 
REPEAT: GET K$:UNTIL K$="Y" OR K$="N" 

IF K$="Y¥" THEN RUN 
CLS:PING:PRINT “Bye for now.":POKE #26A,3:END 
REM * VIEW # 

IF SCRN(X+1,Y)<>35 THEN RETURN 
DIST=INT (SQR ( (MM-X) # (MM-X) + (NN-Y) # (NN-Y)) /2) 
A$=CHR$ (48+DIST) 

IF DIST>9 THEN A$="X" 

IF DIST>@ AND RND(1)<.5 THEN A$="?" 
PLOT X+1,Y,A$:STATE=DIST=@ 
RETURN 

REM * SETUP * 

CLS:PRINT SPC(11)3; "TREASURE HUNT"sPRINT 
FOR I=1 TO 11 

: PRINT SPC(3); 

: FOR J=@ TO 13 

: PRINT CHR$(27)+"H#"s 

: NEXT 

: PRINTs:PRINT 
NEXT 
PRINT E$+"A Use cursor keys to move." 
PRINT:PRINT E$+"D Press <Space bar> to view. "; 


1110 PRINT CHR$(11);CHR$(11);CHRS$(11) 

112@ X=16:Y=12 ‘INITIAL POSITION 

1130 MM=2*INT(RND (9) #1441) +2: NN=2#INT(RND(9) #1141) 
114@ STATE=FALSE 

1158 RETURN 

2008 REM # INFOrmation +# 

2018 POKE #26A,1@ ‘Disables cursor and key click 
2028 INK @:PAPER 3:CLS: PRINT 

2030 ES=" "+CHR$(27) sD$S=E$+"J"+CHR$ (4) 

2040 PRINT D$;SPC(9); "TREASURE HUNT":PRINT D$ 

2058 PRINT: PRINT 

2068 PRINT D$;SPC(6)3"“by Czes Kosniowski":PRINT D$ 
2070 PRINT:PRINT E$+"A Find the hidden treasure." 
2080 PRINT “By pressing the <space bar> you will" 
2098 PRINT “be told how far away the treasure is" 
2100 PRINT “approximately. Sometimes a ? appears" 
2118 PRINT “to confuse you. An X means that the" 
2128 PRINT “distance is 1@ or more. 600D LUCK" 
213@ PRINT: PRINT ES+"B"+E$4"L Press Y to continue." 
2148 REPEAT: K$=KEY$:K=RND(1): UNTIL K$="Y" 

2158 RETURN 


The main routine 


The main part of the program waits for you to press a key. If one of the 
cursor keys (ASC values 8 to 11) is pressed then the position of the flashing 
bush is changed. This is achieved by using PLOT X,Y,8 which disables 
flashing; and PLOT X,Y,12 which enables flashing. Note that position 
(X+2,Y) already contains the control character CHR$(27)+CHR$(8) which 
also disables flashing and consequently only the bush at (X+1,Y) flashes. 

If the space bar (ASC value 32) is pressed then the subroutine VIEW is used 
to print the distance between you and the treasure. When this distance is 
zero the value of STATE is TRUE and the program exits from the loop. 
Various sound effects and messages are then displayed. 


The subroutines 


500 VIEW 

This calculates the distance DIST between you and the treasure. If this 
distance is 10 or more then the number is converted to an X, also about half 
of the time the distance is not revealed! When the distance is zero the value 
of STATE becomes TRUE which causes the program to proceed to the 
finishing stages. 


1000 SETUP 

This creates the initial display of bushes. The position of the treasure is 
selected randomly. Note that PRINT CHR$(27)+"H#"; prints a space 
followed by the hash symbol. The space contains the control character 
CHR$(27)+CHR$(8) which is used to stop all characters to the right of that 
position flashing. 


2000 INFO 

Information briefly describing the game is contained in this subroutine. 
Note. When you switch on your ORIC and ask for a random number you 

obtain the same sequence of random numbers. To randomize this sequence a 

line has been inserted in the program whereby the computer selects (and 

ignores) some random numbers until the player presses the Y key. You will 

find such a line in most of the programs within this book. 


2 Don't Cry Wolf 


Imagine being in a deep forest and it’s getting late. You have to make your 
way home (H on the screen). There are several hungry wolves around ready 
to snap if they come near you. Can you reach home safely? 

To move about use the cursor keys and the following keys (which enable 
you to move diagonally): 


1 diagonally up-left \ diagonally up-right 
Z diagonally down-left / diagonally down-right 


With these diagonal moves you can squeeze between trees. 

Take your time and think about each move you make. If you are being 
chased by wolves — don’t despair — yc"! can outwit them if you try. The 
wolves are rather dumb and often get stuck in corners and behind trees. 
Also they cannot squeeze diagonally between the trees. 

With each successful home coming you have the opportunity to play 


YOUR MOVE 


There are 8 wolves around. 





again — with an extra wolf around. 
The wolves remain hidden during the first few moves — but they 
nevertheless move towards you. Beware! and don’t cry wolf. 


10 REM HHHHERHEHRHHER RE ES 

28 REM * DON’T CRY WOLF * 

3O REM HHKRRERERERERE REESE 

40 REM 

5@ APPEAR=500: WMOVE=600: EEK=7@@: MOVE=808 
6@ SETUP=1008: CHR=1500: INFO=2008 

100 REM #* THE MAIN PROGRAM #* 

11@ GOSUB INFO:GOSUB CHR 

128 REPEAT 

138 : GOSUB SETUP 

148 : REPEAT 

158 : PRINT H$:REPEAT: UNTIL KEY$="" 
168 : REPEAT 


178: GET 6$:G=ASC(6$) 
188:  ANS*FALSE 

199: IF 6=49 OR G=9@ OR G=47 OR G=92 THEN ANS=TRUE 
208 : IF 6>7 AND G<12 THEN ANS=TRUE 

218 : UNTIL ANS 

220: XN=X:YN=Y 

230: IF (6=49 OR G=9@ OR G=8) AND XN>2 THEN XN=XN-1 
240: IF (6=92 OR G=47 OR G=9) AND XN<35 THEN XN&XN+1 
258: IF (6=9@ OR G=47 OR G=18) AND YN<23 THEN YN=YN+1 
268: IF (6249 OR G=92 OR G=i1) AND YN>3 THEN YN=YN-1 
278 : PLOT X,Y,32:WW=SCRN(XN, YN) 

288: IF WW=32 OR WW=72 THEN X=XN:Y=YN 

298 : PLOT X,Y,Z 

308: IF X=33 AND Y=5 THEN PING: WAIT 20:PING:STATE=1 
310 : PRINT W$:TEST=FALSE: XY=SCRN(A(NW4+1) ,B(NW+1) ) 
320: IF NW<=WO AND RND(1)<.3 AND XY=#32 THEN TEST=TRUE 
338: GOSUB WMOVE-TEST#(APPEAR-WMOVE) 

34@ : UNTIL STATE 

358 : PRINT At 


368 : REPEATSGET K$: UNTIL K$="Y" OR-K$="N" 
378 UNTIL K$="N" 
388 CLS:PRINT “Bye for now. ":POKE #26A,3:END 


588 
518 
520 
538 
548 
608 
618 
628 
638 
648 
658 
668 
678 
688 
708 
718 
728 
730 
740 
B80 
818 
828 
838 
848 
850 
840 
878 
888 
890 
900 
1008 
1018 
1028 
1838 
1040 
1058 
1068 
1078 
1088 
1098 
1188 


REM ## APPEAR ## 
NW=NW+1:PLOT A(NW) ,B(NW) ,W 
MUSIC 1,1,4,0:PLAY 3,0,1,2500:WAIT 48 
MUSIC 1,1,3,@:PLAY 3,0,1,2500:WAIT 58 
PLAY 8,0,8,@:RETURN 
REM ** Wolf MOVE ## 
IF STATE THEN RETURN 
FOR I=@ TO WOLVES-1 
: GOSUB MOVE 
: IF I<=NW THEN PLOT ACI), BCI) ,32 
: ACT) =A:B(1I) 5B 
: IF I<=NW THEN GOSUB EEK 
NEXT 
RETURN 
REM ## EEK #4 
PLOT A,B,W 
IF A<>X OR BX>Y OR STATE THEN RETURN 
PLOT X,Y,"EEK": ZAP:STATE=2 
RETURN 
REM ## MOVE #+# 
XX=(ACT) OX) -CACT) CX) SYV= (BCI) OY) -( BCI) <Y) : S=8 
IF YY=@ THEN S=1:YY=1 
IF XX=@ THEN S=2:XX=1 
TEST=FALSE: T=-1 
REPEAT 
: T=T+1sAZA(T)+U(S,T)#XXsBeB( I) +V(S,T)#YY 
: SS=SCRN(A,B): TT=SCRN(A(I) ,B) sUU=SCRN(A,B(I)) 
: IF SS<W AND (TT<W OR UU<W) THEN TEST=TRUE 
UNTIL TEST OR T>7 
RETURN 
REM ## SETUP of screen ## 
PAPER 3: INK @:PRINT FRE(9):CLS 
WOLVES=WOLVES+ (WOLVES<2@) #(STATE=1) 
STATE=@ 
NW=-1 ‘Number of wolves appearing 
FOR X=1 TO 34 
: PLOT X,2,16@:PLOT X,24,168 
NEXT 
PLOT 11,2,"DON‘'T CRY WOLF" 
FOR Y=3 TO 23 
: PLOT 1,Y,16@:PLOT 36,Y,168 


1118 
1128 
1138 
1148 
1158 
1168 
1178 
1188 
1198 
1200 
1218 
1220 
1230 
1248 
1250 
1268 
1278 
1288 
1588 
1518 
1520 
1538 
1548 
1558 
1548 
1570 
1588 
1590 
1608 
1618 
14620 
1638 
1648 
1780 
1718 
1728 
1738 
1748 
28008 
2018 
2628 


10 


: FOR X=2 TO 35 

: IF RND(9)>.75 THEN PLOT X,Y,168 

NEXT: NEXT 

PLOT 5,246,"There are" 

PLOT 146,26,MID$(STR$(WOLVES) ,2) 

PLOT 19,26,"wolves around." 

FOR Y=3 TO 7:FOR X=2 TO 4 

: PLOT 29+X,Y,32:PLOT X,14+Y,32 

NEXT: NEXT 

PLOT 33,5,72:PLOT 4,21,37 

X=43 Y=21:2=37 

REM Position of the wolves 

FOR I=@ TO WOLVES-1 

: REPEAT 

: ACT) SINT(RND (1) #3442) :B(1) =INT(RND (1) #21+3) 
: UNTIL SCRN(ACI),B(I))=32 AND B(I)-A(I)<17 
NEXT 


RETURN 

REM #*# CHR ## 

H$=CHR$ (30) +ESt+"L"+ES+"A YOUR MOVE" 
WS=CHR$ (30) +CHRS$ (14) 

AS=CHR$ (30) +ES+"L"+E$+"D Another go? Y or N 


W=38:DIM A(2@),B(2@) 
START=#B400+3748: AA=#AG0@ 

POKE AA,2:IF PEEK(AA)<>2 THEN START=START-#8008 
FOR I=START TO START+7:READ R:POKE I,R:NEXT 
START=START+8 

FOR I=START TO START+7:READ R:POKE 1,R:NEXT 
STATE=0 

FOR S=@ TO 2:FOR T=@ TO 8 

: READ U(S,T),V(8,T) 

NEXT: NEXT 

RETURN 

DATA 14,14,4,31,14,14,10,108 

DATA 2,3,35,30,30,38,18,18 


DATA 1,1,1,@,0,1,1,-1,-1,1,0,-1,-1,0,8,0,0,8 
DATA 1,@,1,-1,1,1,0,-1,0,1,-1,- i ie 1,0,0,0 
DATA @,1,1,1,-1,1,1,0,-1,0,1,-1,-1,-1,8,-1,0,0 


REM ## INFOrmation *# 
ES=" "4+CHR$(27) s D$=E$+CHR$(4)+"I" 
PAPER 6: INK @:CLS:PRINT 


2038 PRINT D$3SPC(9);"DON'T CRY WOLF":PRINT: PRINT D$ 
2040 PRINT:PRINT D$;SPC(7)3; “by Czes Kosniowski":PRINT D$ 
2058 PRINT:PRINT "You are in a deep forest and there" 
20468 PRINT “are wolves around. Try and get back" 

2078 PRINT “home (H) - but"+E$+"DDON’T CRY WOLF." 
2088 PRINT “You can sqeeze between the trees but" 
2098 PRINT “the wolves can’t.” 

21080 PRINT:PRINT “CONTROLS: " 

2118 PRINT “Cursor keys for Left, Right, Up, Down" 
212@ PRINT “ 1 for Up-Left \ for Up-Right* 

2138 PRINT "| Z for Down-Left / for Down-Right" 
2140 PRINT: PRINT 

2158 PRINT “How many wolves do you to start with?" 
2168 PRINT "Select a number between 2 and 9: “$3 

2178 REPEAT: G$=KEY$:GG=RND(1)sUNTIL G$>"1" AND G$<"3" 
2188 WOLVES=VAL (G$) 

2198 POKE #26A,2 Disables cursor 

2288 RETURN 


The main routine 


The main part of the program waits for a key to be pressed. If it is one of the 
eight permitted keys then the program proceeds to move you and, 
consequently, the wolves. 


The subroutines 


500 APPEAR 

This determines when a wolf appears. There is a 30% chance that a wolf 
apppears during a move. Note that when a wolf appears the other wolves 
do not move. This gives the player a chance to escape. 


600 WMOVE 

This subroutine together with the subroutine MOVE, moves the wolves (even 
those not visible). It also checks to see if a wolf has reached you. Invisible 
wolves do no harm until they become visible. 


700 EEK 
This is a subroutine of the subroutine WMOVE. Its main purpose is to ZAP you 
when a wolf reaches you. 


800 MOVE 
A simple calculation is performed to determine where each wolf should 
move. If possible, each wolf moves closer to you, although if there isn’t a 


11 


closer position it will move one step away. Sometimes this causes a wolf to 
move backwards and forwards, giving you a chance to escape. 


1000 SETUP 
This creates the random forest screen display and determines where the 
wolves are originally positioned. ; 


1500 CHR 
The custom characters (you and the wolves) are created by this subroutine. 
There is also a line which takes care of changes in the location of characters 
between the 48K and the 16K ORICs. 

In addition this subroutine initializes some of the constants (numbers of 
wolves etc.). 


2000 INFO 
A brief outline of the game is contained in this subroutine. 


12 


o Mioon Landing 


You are in command of a lunar module. It has just detached itself from the 
mother ship and is in free fall. Only the retro-rocket (the space bar) will slow 
you down. Fuel is in short supply; so don’t keep pressing that space bar. 

Because of the cheap imported components used to build your module it 
is very sensitive to speed. Indeed, if you exceed a speed of 100, your module 
explodes! 

Try to land at a speed of 10 or less. 

Your ORIC provides a graphic display (with sound) of your velocity, 
height and fuel. 


ATOrwmMm st 


4 
E 
L 
0 
Cc 
I 
; 
¥: 





*Tmen Cmeoen romen 





H 
E 
I 
G 
H 
T 
9 





13 


10 REM He#HHRHRHREHEREES 

2@ REM # MOON LANDING *# 

3Q REM HHHHRHKHHEHHEHES 

48 REM 

5@ CALCFUEL=50@: DISP=400: INSTRUCT=1000: SETUP=1500 


100 
110 
120 
130 
148 
158 
160 
178 
188 
198 
200 
218 
228 
230 
248 
258 
268 
270 
288 
298 
388 
318 
320 
338 
348 
358 
368 
378 
388 
398 
400 
580 
518 
528 
538 
548 


14 


REM ## THE MAIN PROGRAM ## 

GOSUB INSTRUCT: GOSUB SETUP 

REPEAT 

: VELOCITY=VELOCITY+ACCEL 

: SOUND 4,125-VELOCITY/4,7 

: IF VELOCITY<@ THEN SOUND 5,208-VELOCITY,7 

: YI=INT(VELOCITY/5) : Y2=INT(VELOCITY-S#Y1) : X=7 
: GOSUB DISP 

: PLOT 7,26, MID$(STRE(INT(VELOCITY)),2)+" * 
: HEIGHT=HEIGHT-VELOCITY/188 

s YIZINT(HEIGHT/8): Y2=INT(HEIGHT-8#Y1) 3 X=19 

: GOSUB DISP 

: PLOT 18,26, MID$(STRS(INT(HEIGHT#1@)),2)+" “ 
: IF KEY$<>"" THEN GOSUB CALCFUEL 

UNTIL HEIGHT<.1 OR VELOCITY>180 

EXPLODE 

FOR I=8 TO INT(VELOCITY/1@) 

: PAPER 1:WAIT 10:PAPER 4:WAIT 18:PAPER 7:WAIT 18 
NEXT 

PRINTsPRINT CHR$(14) 3 CHR$(1@) sCHR$(14); 

PRINT CHR$(11);CHRS$(4)3 

IF VE>10@ THEN PRINT Wi$ 

IF VE<=108 AND VE>2@ THEN PRINT SPC(10)3W2$ 
IF VE<=2@ AND VE>1@ THEN PRINT SPC(13)3W3$ 

IF VELOCITY<=18 THEN PRINT SPC(12);W4$ 

WAIT 5@8:PRINT 

PRINT E$+"N Another go? Y or N“;SPC(8) 
PRINT CHR$(4) 

REPEAT:GET K#s UNTIL K$="Y" OR K$="N" 

IF K$="Y¥" THEN RUN 

CLS:PRINT "Bye for now":POKE #26A,3:END 

REM ## CALCulate FUEL ## 

IF FUEL<1 THEN RETURN 

FUEL=FUEL-F 

YIsINT (FUEL/8) s Y2=INT (FUEL-8#Y1) 2 X=32 

IF Yi¢@® THEN RETURN 


558 

548 

578 

4600 

618 

620 

638 

4648 

658 

640 

1000 
1812 
1020 
1830 
1048 
10508 
1040 
1070 
1088 
1098 
1180 
1110 
1120 
1130 
1148 
1158 
1168 
1588 
1518 
1520 
1538 
1548 
1558 
15468 
1578 
1580 


1598 : 


14680 
1618 
1628 
1630 


VELOCITY=VELOCITY-BRAKES:GOSUB DISP 
PLOT 31,24, MID$(STRSCINT(FUEL/2)/1@@) ,2)+" © 
RETURN 
REM ## DISPlay #+# 

IF Yi<@ OR Yi>24 THEN RETURN 
FOR I=@ TO 1 

: PLOT X#1,24-Y¥1,32:PLOT X+1,25-Y1i,32+Y2 

: IF Y1>@ THEN PLOT X+I,24-Y1i,A$ 
NEXT 
RETURN 

REM ## INSTRUCTions #**# 

CLS:PAPER 4: INK 7:E$=" “+CHR$(27) 
D$=E$4+"J"+CHR$ (4): PRINT 

PRINT D$+E$+"C"3SPC(9)3 "MOON LANDING" 

PRINT D$: PRINT: PRINT 

PRINT D$+E$+"C"3SPC(46)3 "by Czes Kosniowski" 
PRINT D$: PRINT: PRINT 

PRINT “You are in command of a lunar module." 
PRINT “It is in free fall and only the retro" 
PRINT “rocket Cthe space bar) will slow you" 
PRINT “down. Do not exceed a speed of 100." 
PRINT:PRINT “Try to land at a speed of under 1@" 
PRINT: PRINT ES+"L"+E$+"A"3 SPC (10); "GOOD LUCK" 
PRINT: PRINT E$t+"L"+E$+"B Press Y to continue." 
POKE #26A,1@ ‘ Disables cursor and keyclick 
REPEAT: K$=KEY$:K=RND(1) UNTIL K$="¥" 

RETURN 

REM ## SETUP ## 

CLS:PAPER 7: INK Q@:PING 

START=#B400+33*8: AA=#ABOO 

POKE AA,2:I1F PEEK(AA)<>2 THEN START=START-#8000 
FOR I=@ TO &3:POKE START+1I,127: NEXT 

FOR I=@ TO 6:FOR J=@ TO 4-I 

: POKE START+J+1#8,8 

NEXTsNEXT 

FOR I=1 TO 25 


PLOT 6,1,MID$(" EMV TY "V1,1) 
: PLOT 18,1,MID$("HETGHT HEIGHT",I,1) 
: PLOT 31,1,MID$("F UEL FUEL FUEL",I,1) 


NEXT 
FOR I=@ TO 25 


15 


1640 : PLOT 1,1,1sPLOT 13,1,4:PLOT 24,1,2 
1658 NEXT 

14660 AS="(":BS="!" 

167@ FOR I=8 TO i 

1688 : FOR J=1 TO 25 

1690 : PLOT 194+1,J,A$:PLOT 32+1,J,A$ 

1708 : NEXT 

1710 : PLOT 1,24+1,5:PLOT 7+1,24,A$:PLOT 7+1,25,A$ 
1728 NEXT 

1738 PLOT 21,1,"200@":PLOT 21,7,"1580" 

1748 PLOT 21,13,"100@":PLOT 21,19," 500" 

1750 PLOT 21,25,B$+"80" 

1768 PLOT 34,1,"FULL":PLOT 34,7," 3/4" 

1770 PLOT 34,13,"HALF“:PLOT 34,19," 1/4" 

1788 PLOT 34,25,B$+"8a" 

1798 PLOT 9,5,B$+"10@":PLOT 9,18,B%+"75" 

1888 PLOT 9,15,B$+"S@":PLOT 9,20,B%+"25" 

181@ PLOT 9,23,B$+"1@":PLOT 9,25,B$+"00" 

1828 PRINT ES "@ “s:PLOT 31,26,"FULL" 

183@ HEIGHT=199: FUEL=199: ACCEL=. 9: BRAKES=1.8 
1840 F=.9+.4#RND(1):VELOCITY=18 

1850 WiS=E$+"N You went too fast and EXPLODED" 
1868 W2$=E$+"NCRASH LANDING" 

1870 W3$=E$+"NNOT BAD" 

1880 W4$=E$+"NWELL DONE" 

189@ PLAY 0,7,8,8 

1988 RETURN 


The main routine 


On each cycle the current velocity and height are displayed - both 
numerically and visually. The latter uses the subroutine DISP. Whenever a 
key is pressed fuel is consumed (if there is any left) via the subroutine 
CALCFUEL. 

The routine ends when either the velocity exceeds 100 or the height is 
about 0. 


The subroutines 


500 CALCFUEL 
This is used to calculate and display the quantity of fuel remaining. The 


16 


graphic display uses the subroutine DISP. 


600 DISP 
This simply plots the appropriate custom character to display the velocity, 
height or fuel. 


1000 INSTRUCT 
Brief instructions for the game are contained in this subroutine. 


1500 SETUP 
The custom characters are created here. There is nothing fancy about these 
characters, each is a solid block of a certain height. The characters have ASC 
code 32 to 39 and range uniformly from a blank space to a solid block. 
After these custom characters have been created the initial screen display 
is produced. 
Note: After running this program you may like to press the reset button on 
the ORIC. This will restore the standard characters. 


17 


4 Bird and Caterpillar 


In this game you are a hungry caterpillar crawling over the screen. There is 
food nearby — but can you reach it in time? The caterpillar cannot stop — but 
the direction that it moves can be changed by using the cursor keys. 

Be careful, the caterpillar must not hit the wall (the edge of the screen 
display) otherwise it gets squashed. Also, the caterpillar mustn’t suddenly 
go backwards otherwise it bites itself and the game ends. Thus, if the 
caterpillar is moving left don’t press the right cursor key. Instead, press the 
up or down cursor key first. 

There is even more danger around. A hungry bird (controlled by the 
ORIC) is flying around seeking the food and the caterpillar. 

As soon as a piece of food is eaten another piece appears somewhere else. 
See how much food the caterpillar can eat before getting squashed, biting 
itself or being eaten by the bird. 


BIRD AND CATERPILLAR 





18 


18 
20 
38 
40 
50 
68 
108 
110 
120 
130 
148 


15@ : 


1468 
178 


180 : 


198 
208 
210 
228 
230 


248 : 


250 
268 


278 : 


288 


298 : 
300: 


318 
328 


330 : 


358 : 


368 


370 : 


380 


398 : 


400 
418 
420 
430 


REM HHHEHHHEEHHEEEHHER RHEE EHEE 
REM * BIRD AND CATERPILLAR * 
REM HHEHHHERRH HEHEHE EE HERE HEHE 
REM 
BIRD=500: DIRECT=700: FOOD=900: SETUP=1208 
INITIAL=1500: CHR=1700: DESCRIP=2000 

REM ** THE MAIN PROGRAM ## 

GOSUB DESCRIP: GOSUB INITIAL 

REPEAT 

: GOSUB SETUP: GOSUB FOOD: STATE=FALSE 

: REPEAT 
K$=KEY$: IF K$<>"" THEN GOSUB DIRECT 
: PLOT P(2),Q@(2),32 
: FOR I=2 TO 1 STEP -1 
P(T)=P(I-1):Q(1)=Q(1-1) 
: NEXT 
: P(@)=P(0)+DP:8(8)=8(0)+DO 
: PQ=SCRN(P(O) ,Q(Q)) 
: IF P@¢>32 AND PQ<>C THEN STATE=PQ 
: IF PQ=C THEN ZAP:WAIT 3@:GOSUB FOOD: SUM=SUM+1 
FOR I=@ TO 2:PLOT P(I),Q(1) ,ReNEXT 


: GOSUB BIRD 
: IF X=A AND Y=B THEN ZAP:WAIT 3@:GOSUB FOOD 
FOR [=@ TO 2 
: IF X=P(I) AND Y=Q(I) THEN STATE=1 
NEXT 
UNTIL STATE 
: EXPLODE 


: FOR I=1 TO 3:PAPER i:WAIT 2@:PAPER 7:WAIT 20:NEXT 
: PAPER @:PRINT B$ 

: W=-(STATE=1)-(STATE=223) -2% (STATE=160) 

: PRINT AS(W) 

: PRINT CHR$(27)+"T"+E$+"GThe caterpillar ate ";SUM; 
IF SUM=1 THEN PRINT "bit of food"+C$ 

: IF SUM<>1 THEN PRINT "bits of food"+C$ 

PRINT CHR$(27)+"R°+E$+"G"; 

: PRINT "“ Another go? Y or N";SPC(1@) 

: REPEAT: GET G$: UNTIL G$="Y" OR G$="N" 

UNTIL G$<¢>"Y" 

CLS:PRINT "Bye for now. ":INK 7:POKE #26A8,3:END 


19 


588 
518 
528 
538 
548 
558 
548 
700 
718 
720 
738 
748 
758 
908 
918 
928 
930 
948 
950 
10880 
1018 
1828 
1030 
10840 
1858 
1068 
1878 
1080 
1898 
1180 
1118 
1120 
1138 
1148 
1158 
1168 
1178 
1508 
1518 
1528 
1530 


20 


REM #* BIRD movement +## 
XX=SGN(A-X): YY=S6N(B-Y) 

IF RND(1)<.3 THEN XX=SGN(P(@)-X): YY=SGN(Q0(@)-Y) 
IF XX#YY<¢>@ AND RND(1)<.5 THEN XX=0 
IF XX#YY<>@ THEN YY=2 
PLOT X,Y,32:X=X+XX:Y=VY+VY:PLOT X,Y,2Z 
RETURN 
REM *#* DIRECTion *# 

KK=ASC(K$) 

IF KK<8 OR KK>1i1 THEN RETURN 
DP=(KK=8) -(KK=9) 
DQ=(KK=11)-(KK=18) 
RETURN 
REM ## FOOD ** 
REPEAT 

: A=INT(RND(1)#36+2) sBEINT(RND(1)*#25+1) 
UNTIL SCRN(A,B)=32 
PLOT A,B,C 
RETURN 

REM ## Screen SETUP ## 

PAPER @: INK 2:PRINT FRE(9):CLS 

FOR X=1 TO 38 

: PLOT X,@,14@:PLOT X,26,140 

NEXT 

FOR Y=1 TO 25 

: PLOT 1,Y,16@:PLOT 38,Y,168 

NEXT 

REM BIRD POSITION 
X=INT(RND (1) #3642): Y=3:2=223 

PLOT X,Y,2Z 

REM CATERPILLAR 
P(@)=30:P(1)=31:P(2)=32 
Q(@)=22:6(1)=22:0(2)=22 

FOR 1=@ TO 2:PLOT P(I),Q(1) ,R:NEXT 
DP=-1:DQ=@ ‘Direction 
C=38:R=37:SUM=0 

RETURN 

REM #* INITIAL setup ## 
START=#B400+37#8: AA=#AQ00 

POKE AA,2:IF PEEK(AA)<>2 THEN START=START-#8008 
GOSUB CHR 


1548 
1550 
15468 
1570 
1580 
1598 
1680 
1418 
14620 
1728 
1718 
1720 
1730 
1740 
1758 
2000 
2010 
2020 
2038 
2040 
2050 
2068 
2070 
2088 
20908 
2180 
2118 
2128 
2130 
2148 
2150 
2142 


START=START+8:GOSUB CHR 

START=START+454:G0SUB CHR 

BS=CHR$ (27) +"Q"+CHR$(27)+"G . 

C$=" "+CHR$ (14) 

A$(0)=B$+" The caterpillar bit itself"+C$ 
A$(1)=B$+"The bird ate the caterpillar"+C$ 
A$(2)=B$+"The caterpillar got squashed"+C$ 
BS=CHR$ (30) +BS+" BIRD AND CATERPILLAR "+C$ 
RETURN 

REM ## CHR #+# 

FOR I=START TO START+7:READ X:POKE I,X:NEXT 
RETURN 

DATA 12,12,30,43,463,38,12,12 

DATA 4,14,31,31,14,4,4,4 

DATA 63,45,63,63,51,63,33,63 

REM ## DESCRIPtion #+# 

INK @:PAPER 6:CLS:PRINT 

POKE #26A,2 ‘Disables cursor 

E$="— "4CHR$(27) s DS=E$St"J"+CHR$ (4) 

PRINT D$;SPC(6)3;"BIRD-AND CATERPILLARS :¢PRINT D$ 
PRINT: PRINT 

PRINT D$;SPC(7)3"by Czes Kosniowski" 

PRINT D$:PRINT 

PRINT "Guide the caterpillar to the food." 
PRINT “But, avoid the walls and the bird!" 
PRINT "Also, don’t bite yourself by suddenly" 
PRINT “going backwards.“ 

PRINT: PRINT “To CHANGE direction use the cursor" 
PRINT “keys." 

PRINTSPRINT E$+"L"3SPC(8)3 "Press Y to start" 
REPEAT: G$=KEY$:G=RND(1):UNTIL G$="Y" 

RETURN 


The main routine 


The main routine moves the caterpillar and bird around the screen. 

A check is made to see if the caterpillar has hit the wall, bitten itself or 
eaten the food. Similarly a check is made to see if the bird has eaten the 
caterpillar or the food. 


21 


The subroutines 


500 BIRD 

This controls the direction in which the bird moves. On each occasion the 
computer decides whether the bird should move towards the caterpillar 
(30% of the time) or towards the food (70% of the time). Having decided 
what to aim for, the bird moves one step towards that goal. 


700 DIRECT 
After reading the keyboard this subroutine calculates the direction that the 
caterpillar must move. Only the cursor keys have any effect. 


900 FOOD 

Whenever food is needed this subroutine selects its position on the screen. 
A check is made to ensure that the food only appears in an empty space 
(away from the wall, bird and caterpillar). 


1000 SETUP 
The screen display is set up by this subroutine. It creates the surrounding 
wall, and positions the bird and caterpillar on the screen. 


1500 INITIAL 

Three custom characters are needed, the bird, the food and the caterpillar. 
The bird is just a face and replaces the character with ASC code 223 (which is 
the reverse of the character with code 95). The food and caterpillar designs 
replace the characters with ASC codes 37 and 38. The caterpillar actually 
consists of three diamonds joined together. 


1700 CHR 
This is a short subroutine which reads the DATA for the custom characters 
and POKEs it into the appropriate place. 


2000 DESCRIP 
This contains a brief description of the game. 


22 


5 fwenty-five Squares 


This is a puzzle-type game in which the ORIC mixes up the twenty-five 
letters of the alphabet A to Y. The object is to rearrange them into their 
correct position as shown below. 


=< 
< 
woo 
rom 
= 
a 


< 
c 
ao + 
voz 
z 
r 


Only certain groups of letters may be moved at any one time. These 
groups consist of the eight letters in the upper, bottom, left or right sections. 
The moves are achieved by pressing keys 1 - 8. Each of the odd numbered 
keys moves one particular group of letters round in a clockwise direction, 
while the even keys move them anticlockwise. For example, pressing key 1 
moves the eight letters on the left (TUVWXYBA in the diagram) round in a 
clockwise direction. Key 0 is used to abandon the game. 


23 


The game has various levels of difficulty. At the easiest level (Level 1) only 
two moves are made by the computer. See if you can work out which two. 
At higher levels of play the game could prove to be quite hard and 
challenging. Speed is not important in this game, thinking is! 





Twenty-five squares puzzle. 


To give up —- press @ 


10 REM HEHEHE HHHEHREHHRH HERE EHEE 

20 REM # TWENTY-FIVE SQUARES +* 

3D REM HEHHHEEKH HHH HEHEHE EHEHHEE 

40 REM 

5Q@ MOVE=500: DISP=1000: INITIAL=1500: DETAILS=2000 


108 
110 
120 
138 
140 
158 


1460 : 


178 
182 
198 
200 


24 


REM ** THE MAIN LOOP ## 

GOSUB DETAILS: GOSUB INITIAL 

GOSUB DISP:STATE=FALSE 

REPEAT 

: ANSWER=FALSE 

: REPEAT:GET G$: UNTIL G$>"/" AND G$<"9" 
GOSUB MOVE+S@#VAL(6$):IF G$<>"@" THEN GOSUB DISP 
: REM CHECK FOR END 

: IT=@ 

: REPEAT 

: TsI+l:IF AZ(I)<>64+1I THEN ANSWER=TRUE 


218 
228 
230 
248 
258 
268 
270 
288 
290 
308 
508 
518 
528 
538 
548 
558 
56a 
578 
388 
598 
608 
618 
628 
630 
648 
658 
660 
670 
4680 
698 
700 
710 
720 
730 
748 
758 
768 
778 
780 
790 
808 


: IF 1>24 THEN ANSWER=TRUE: STATE=1 

: UNTIL ANSWER 

UNTIL STATE 

PRINT CHR$(3@) 

REM ENDING 

IF STATE=i1 THEN PRINT WS$:PING: WAIT 3@:PING 
PLOT 10,3,"Another go? Y or N" 

REPEAT: GET G$: UNTIL G$="Y" OR G$="N" 

IF G$="Y" THEN RUN 

CLS:PRINT “Bye for now. "sPOKE #26A,3:END 
REM ## MOVE @ - Quit #+# 

STATE=2 

ANSWER=TRUE 

RETURN 

REM Just to fill the space. 

REM ## MOVE 1 - Left clockwise #+# 

B4=A% (25) 

FOR 1=25 TO 21 STEP -1:AZ(I)=AXL(1-1) NEXT 
AX(28)=AZ(1) sAX(1) =AZ (2) 2AZ(2) =B% 
RETURN 

REM ** MOVE 2 - Left anticlockwise ## 
BZ=A% (28) 

FOR 1=20 TO 24:sAX(1)=AX(I+1) sNEXT 
AZ(25)=AL(2)2AL(2) =AL(1) SAL (1) =BX 
RETURN 

REM *## MOVE 3 - Up clockwise #*# 

BA=A% (8) 

FOR I=8 TO 2 STEP -1:AX(1)=AXZ(1I-1) s NEXT 
AZ(1) =B% 

RETURN 

REM #* MOVE 4 - Up anticlockwise #*# 
BA=AL(1) 

FOR I=1 TO 7: AX(1)=AZ(I+1) sNEXT 
ALZ(B8)=B% 

RETURN 

REM ** MOVE 5 - Right clockwise #*# 
BZ=AZ(14) 

FOR I=14 TO 9 STEP ~-1:AXZ(1T)=AZ(I-1) NEXT 
AZ(B) =A (1) :AL(1) =B% 

RETURN 

REM *#* MOVE 6 - Right anticlockwise ## 


25 


818 
828 
838 
84a 
858 
84a 
870 
888 
898 
900 
918 
928 
930 
948 
1880 
1018 
1028 
1830 
1040 
1058 
1580 
1518 
1520 
1530 
1548 
1558 
1568 
1578 
1588 
1598 
1608 
1618 
1628 
1638 
1648 
1658 
1648 


1678 : 


1688 
1698 
1782 


26 


BA=AZ (8) 
FOR I=8 TO 13:AZ(1)=AX (141) sNEXT 
AZ(14)=AZ (1) 3AZ(1) =B% 
RETURN 
REM *# MOVE 7 - Down clockwise #+# 
BZ=AZ (20) 
FOR I1=28 TO 15 STEP -1:A%Z(1)=AZ(I-1) s NEXT 
AZ(14)=AZ(1):AZ(1)=BZ 
RETURN 
REM ** MOVE 8 - Down anticlockwise #* 
BZ=AZ(14) 
FOR [=14 TO 19: AZ(1)=AZ(14+1) 2 NEXT 
AZ(20)=AZ(1): AZ (1) =B% 
RETURN 
REM ## DISPlay ## 
FOR [=1 TO 25 
: PLOT X4Z(1),Y2(1) ,AZC(T) 
s PLOT X4(1),YA(1) +1, A2(1) 
NEXT 
RETURN 
REM ## INITIALisation #+# 
CLS:PAPER @:INK 7 
DIM AZ(25) ,X4(25) ,Y¥%¢25) 
FOR I=1 TO 25 
: AZ(I)=64+1 
: READ X4(1),Y%(1) 
NEXT 
FOR [=5 TO 22:PLOT 0,1,1@8:NEXT 
PLOT 0,1,1@:PLOT @,2,1@:PLOT @,3,2:PLOT 1,3,12 
REM MIXING 
FOR J=1 TO ZZ:GOSUB MOVE+5@*INT(8*RND(9) +1) 2NEXT 
Ws=" “ 
WS=ES+"A"+CHRS$(4)+W$4+"WELL DONE "+W$+CHRS (4) 
PRINT:PRINT V$:PRINT E$+"A" 
START=#B400+90#8: AA=#A000 
POKE AA,2:IF PEEK(AA)<>2 THEN START=START-#8000 
FOR I=@ TO 3 
START=START+8 
: FOR J=@ TO 7:READ R:POKE START+J,R: NEXT 
NEXT 
FOR I=1 TO 8 


1718 
1720 
1730 
1748 
1750 
1768 
1778 
1788 
1798 
1880 
1818 
1820 
1830 
1848 
185@ 
1848 
1878 
1888 
1898 
1988 
2008 
20108 
2020 
2038 
2048 
2058 
2060 
2078 
2088 
2098 
2188 
2118 
2128 
2138 
2148 
2158 
2168 
2178 
2188 
2198 
2280 


: READ U,V,X$ 

: PLOT U-1,V,4:PLOT U-1,V+1,4 

: PLOT U,V,X$sPLOT U,V+1,X$ 

: PLOT U+3,V,7:PLOT Ut3,V+t1,7 

NEXT 

PLOT 8,24,4:PLOT 9,24,"To give up - press @" 
RETURN 

REM LAYOUT DATA 

DATA 19,13,17,11,17,9,17,7,19,5,21,7,21,9,21,11 
DATA 23,11,25,11,27,13,25,15,23,15,21,15 

DATA 21,17,21,19,19,21,17,19,17,17,17,15 

DATA 15,15,13,15,11,13,13,11,15,11 

REM NEW CHARACTERS DATA 

DATA 30,6,10,18,16,14,8,4 

DATA 4,8,16,16,18,18,46,38 

DATA 30,24,20,18,2,2,4,4 

DATA 4,4,2,2,18,20,24,38 

REM MORE DATA FOR DISPLAY 

DATA 8,15,01,8,11,\2,15,5,03,22,5,4] 

DATA 29,11,5%,29,15,461,22,21,7%,15,21,\8 

REM #* DETAILS #+# 

CLS:PAPER @: INK 7:POKE #24A,3 

E$=" “4+CHR$ (27): DS=ES+CHR$ (4) 4+"J" 
V$=E$+"A"+D$+" Twenty-five squares puzzle. "+D$ 
PLOT 1,2,1 

PRINT:PRINT V$sPRINTs PRINT: PRINT 

PRINT D$;SPC(7);"by Czes Kosniowski" 

PRINT D$:PRINT 

PRINT “Rearrange the 25 letters back into" 
PRINT “their correct position as shown below." 
PRINT SPC(17)3"E"sPRINT SPC(16)3"D F" 

PRINT SPC(16)3"C G":PRINT SPC(14)3;"XYB HIJ" 
PRINT SPC(13)3"W A K"sPRINT SPC(14)3"VUT NML" 
PRINT SPC(146)3;"S O"sPRINT SPC(16)3"R P" 

PRINT SPC(17);"Q" 

PRINT: PRINT “Use the keys 1 to 7 to move the" 
PRINT “squares around." 

PRINTSPRINT E$t+"DDifficulty level? 1 to 9: "$3 
REPEAT: G$=KEY$: GG=RND (1) sUNTIL VAL(G$) >@ 
ZZ=3#VAL(G$)-1:POKE #26A,2 

RETURN 


27 


The main routine 


The main part of the program waits for one of the keys 0 - 8 to be pressed. 
The appropriate move is then carried out and a check is made to see if the 
letters are in their correct positions. 


The subroutines 


500 MOVE 

Lines 500 to 540 contain the move to quit the game. The other moves, 1 - 8, 
are spaced out at intervals of 50 between lines 550 and 940. The moves are 
called by the statement GOSUB MOVE+50*VAL(G$) where G$ is the key 
pressed. 


1000 DISP 
This simply displays the twenty-five letters in their current positions. 


1500 INITIAL 
The twenty-five letters are stored by their ASC codes (65 to 89) in the integer 
array A%(1). The positions in which the letters are to be plotted is stored in 
the integer arrays X%(I) and Y%(1). 

Four custom characters are created. These are simply four curved arrows. 


2000 DETAILS 
Brief details of the game are contained in this subroutine. 


28 


6 intelligence fest? 


Many questions in intelligence tests and quizzes involve a sequence of 
numbers and/or letters. For example, 


19,7. 16, 135 10, 22% 
0, K, H, E, «.-. 


You then have to write down the next term in the sequence. 

Your ORIC can be used to create all sorts of sequences which will test and 
amuse you. 

For each sequence you have two attempts to get the correct answer. There 
is no hurry — the computer will wait patiently while you think. 

After ten sequences you will be told how many you got correct. Don’t take 
the game too seriously, just have fun. 


INTELLIGENCE TEST? 
SEQUENCE 3 


osclU[wW OO AUreEUCUCdSTCUC<‘“(:™ 


What is the next term ? P 


No - try again 
What is the next term ? R 
The answer is Q 


Press Y to continue 





29 


10 REM €HHREEHHHER ERE RHEE REESE 
20 REM * INTELLIGENCE TEST? * 
3B REM HEREHEEERERERERE EEE EEE 
40 REM 

5@ SEQUENCE=580: INFO=1008 


120 
118 
120 
138 
148 
158 
148 
178 
188 
198 
200 
218 
220 
238 
248 
258 
268 
270 
280 
298 
300 
318 
320 
338 
340 
350 
368 
378 
388 
398 
500 
518 
528 
538 
548 


30 


REM ## THE MAIN PROGRAM ## 
GOSUB INFO 
FOR Zz=1 TO 18 
REM RANDOM NUMBERS 
A=INT(RND (1) #1041) sN=INT(RND (1) #4) 
B=INT(RND (1) #1@):C=1+2%(RND(1)¢.5) 
REM SCREEN 
CLS:PRINT “ "“sI$sPRINT 
PRINT ,,,," SEQUENCE "3ZZ:PRINT 
PRINT CHR$(4):PRINT E$+"J "5 
GOSUB SEQUENCE+100#INT(RND(1)#5):PRINT 
PRINT CHR$(4): PRINT: PRINT 
FOR JJ=1 TO 2 
INPUT “What is the next term "“sY$s:PRINT 
IF Y$=X$ THEN PING: JJ=3: PRINT W$:SC=SC+1 
: IF JJ=1 THEN SHOOT:PRINT E$+"BNo - try again" 
: IF JdJ=2 THEN SHOOT:PRINT E$+"“BThe answer is "3;X$ 
: PRINT 
: NEXT 
t 


PRINTSPRINT E$+"L“+E$+"D Press Y to continue" 
REPEAT: GET G$: UNTIL G$="Y" 
NEXT 
CLS:PRINT:PRINT D$+I$:PRINT D$: PRINT 
PRINT “ Your score out of 10 is “;SC 
FOR I=1 TO SCsPING: WAIT 20:NEXT 
PRINT: PRINT 
PRINT ESt+"L"+E$+"D Another go? Y or N" 
REPEAT: GET G$: UNTIL G$="Y" OR G$="N" 
IF G$="Y" THEN RUN 
CLS:PRINT "Bye for now. ": END 
REM # Arithmetic # 
IF C<® THEN B=B+B8@+INT(RND (1) #18) 
FOR I=1 TO S:PRINT AXI#C+B3" "3s NEXT 
X$=MID$(STRS(A#I#C+B) , 2) 
PRINT: RETURN 


600 
618 
628 
638 
648 
658 
708 
710 
720 
738 
748 
758 
760 
770 
800 
818 
820 
830 
840 
858 
868 
870 
880 
908 
910 
928 
930 
948 
950 
968 
970 
988 
990 
1000 
1010 
1028 
1030 
1048 
1850 
1068 
1070 


REM # Arithmetic letters *# 
FOR I=N TO N+6 
W=A#C#I+B: W=W4+S-264INT(W/26) SPRINT CHRS(W)3" "5 
NEXT 
WHAXC#I+Bs W=Wt+S-26#INT (W/26) 3s XS=CHRS(W) SPRINT 
RETURN 
REM * Two arithmetic *# 
W=8O+INT(RND(1) #18) 
FOR I=i TO 6 
PRINT W;" “3 
W=W+C#A:C=-Ci A=A+Bt1 
NEXT 
PRINT: X$=MID$(STRS(W) ,2) 
RETURN 
REM * Increasing aritheatic # 
W=85+INT(RND (1) #1) 
D=1+2#(RND(1)<¢.5) 
FOR I=1 TO & 
PRINT Ws" "3 
W=W+C#A:C=C#D: A=A+T 
NEXT 
X$=MID$(STRS(W) ,2) SPRINT 
RETURN 
REM # Arithmetic mixed * 
FOR I=N TO N+é 
W=AXC#I+Bs W=W+5-26#INT (W/26) s YS=CHRS (W) 

IF 2#INT(I/2)=1 THEN Y$=MID$(STR$(W-S+1) ,2) 
PRINT Y$+" "3 
NEXT 
W=A*C#I+Bs W=W+S5-264INT (W/26) s X$=CHRS (W) 

IF 2*INT(I/2)=I THEN X$=MID$(STR$(W-S+1) ,2) 
PRINT 
RETURN 

REM ** INFOrmation ## 

INK 7:PAPER @:CLS 

E$=" "+CHR$ (27) :S=65: D$=E$+"J"+CHR$ (4) 
IS=E$+"A INTELLIGENCE TEST?" 

PRINTSPRINT D$+I$:PRINT D$:PRINT: PRINT 

PRINT D$;SPC(7)3;"by Czes Kosniowski":PRINT D$¢ 
PRINT: PRINT “A sequence of numbers and/or letters" 
PRINT “will be given. Use your intelligence" 


31 


108@ PRINT "to work out the next term. Then type" 
1098 PRINT “it in and press <return>.":PRINT:PRINT 
1100 PRINT E$+"L"+E$+"B Press Y to start" 
1118 REPEAT: G$=KEY$:6G=RND(1):UNTIL G$="Y" 

1120 WS$=E$+"BWell done" 

113@ RETURN 


The main routine 


The main routine consists of a loop executed ten times. On each occasion 
some random numbers and a sequence type (one of five) are selected. These 
are then used to produce a random sequence of letters and/or numbers. 

After the sequence has been displayed the computer waits for an answer 
to be typed in. It then responds appropriately. 


The subroutines 


500 SEQUENCE 
This consists of five different sequence types as described below. They are 
called by the statement GOSUB SEQUENCE+100*INTCRND(1)*5). 


500 Arithmetic number sequences 


Examples: 2, 4, 6, 8, 10, 12, 
Vip lig 3G AD 7 C5 Gwe 
Bo 47 7 1S Oy Bp scene 


In an arithmetic sequence the difference between any two consecutive 
terms is constant. In the examples above these differences are 2 for the first 
sequence, 6 for the second and —4 for the third. 


600 Arithmetic letter sequences 


Examples: A, C,E,G,I1,... 
U,X,A,D,G, ... 
0O,N,M,L, K, wu 
Ry tp Hp Py Xpchy eae 


An arithmetic letter sequence is like an arithmetic number sequence 
except that it consists of letters of the alphabet rather than numbers. Thus 
the sequence consists of letters chosen at regular intervals. When the end of 
the alphabet is reached the letters are re-used as in the second and fourth 
example above. 


700 Two arithmetic sequences 


Examples: 85, 91, 80, 96, 75, 101,... 
80, 72, 85, 67, 90, 62, ... 
91; 10151125 125.5-441., 161.7: sees 


32 


These sequences consist of two arithmetic sequences which are linked 
together by alternating between them. One is increasing while the other is 
decreasing. 


800 Increasing arithmetic sequences 


Examples: 87, 97, 108, 121, 137, 157, ... 
90, 87,91, 85, 94, 81, ... 
88, 83,77, 69, 58, 43, wan» 


In these sequences the difference between two consecutive terms 
(ignoring whether it is positive or negative) increases at an increasing rate. 

For example, in the third sequence the differences are 5, 6, 8, 11, 15 which 
increase by 1, 2, 3 and 4 respectively. 


900 Arithmetic mixed sequences 

Examples: 14, P, 18, 1, 22, X, 26, «.. 
22,58, 16,M, 10,6,4,... 
J, 12,N, 16,R, 20, V, .... 


These sequences are a combination of the arithmetic number and 
arithmetic letter sequences. 


1000 INFO 
This contains information and brief details of the game. 


33 


? Hypnotic 


This program is just for fun and amusement - it is not a game — just sit back 
and watch the screen. 


10 REM 4H HHHHHR HEHE 
2@ REM * HYPNOTIC # 
3Q REM HHHHHHHHHEEE 


40 REM 


58 INFO=500 

REM #* THE MAIN PROGRAM ## 
GOSUB INFO 

FOR G=8 TO 40 STEP 18 


180 
118 
128 
130 
148 
150 


168 : 


178 
18@ 
198 
200 
218 
228 
238 
240 
258 
268 
278 
280 
298 


34 


HIRES: POKE #26A,1@:PLAY 2,0,0,8 
FOR Y=198 TO @ STEP -6 

CURSET 1.2#Y,Y,3:FILL 200-Y,1,17 

SOUND 2,25@-Y+6,8 

NEXT 
HIRES: POKE #26A,10:EXPLODE 
FOR [=@ TO 3:PAPER 1:WAIT 10:PAPER Q:WAIT S:NEXT 
PLAY 2,0,8,0 
FOR Y=@ TO 199 STEP & 

CURSET 1.2#Y,Y,3:FILL 208-Y,1,16+RND(1) #8 
SOUND 2,250-Y+6,8 
NEXT 
WAIT 10 


NEXT 

PLAY @,8,@,0:WAIT S@:E$=" "+CHR$(27) 

PRINT:PRINT ES+"B"+E$+"L- Another go? Y or N" 
REPEAT: GET G$:UNTIL G$="Y" OR G$="N" 


308 
310 
508 
518 
520 
53a 
548 
55@ 
568 
578 
588 
598 


TEXT: IF G$="Y" THEN RUN 

CLS:PRINT “Bye for now. ":POKE #268,3:END 
REM ## INFOrmation #+# 

INK 6:PAPER @:CLS:POKE #26A,10sPRINT 

E$=" "+CHR$(27) :DS=E$t+"I"+CHR$ (4) 

PRINT D$;SPC(11)3"“HYPNOTIC"sPRINT D$:PRINT 
PRINT:PRINT D$;SPC(4)3“by Czes Kosniowski" 
PRINT D$:PRINT:WAIT S@:PRINT "RELAX"; 

FOR [=@ TO 3@:PRINT ".“s: WAIT 18:NEXT: PRINT 
PRINT:PRINT “You are about to be"“ssWAIT 108 
PRINT E$+"LHYPNOTIZED.“:WAIT 480 

RETURN 


The main routine 


The main routine fills the HIRES screen in two ways. First with red 
rectangles of increasing size, and second with differently coloured rectang- 
les of decreasing size superimposed on each other. Sound aids the 
pseudo-hypnotic effect while the explosion snaps you out. 


The subroutine 


500 INFO 
This simply gives brief details about the program. 


35 


8 Dancing Men 


We’ve all made paper chains by folding paper, snipping away and then 
unfolding. Try to make a long chain of dancing men on your ORIC. 

In the beginning a man appears at the centre of the screen. A moment 
later another appears just below him. This process then repeats. You can 
change the direction in which the next man appears by using the cursor 
keys. The whole process stops when you hit one of the obstacles (this 
includes hitting a man that is already on the screen). 

The number of men on the screen is displayed at the top right of the 
screen. 









DANCING MEN TOTAL: 81 
















BERERSR EERE NS 


a 
to 


= 
HRERTRTAAETTE 







Another go? Y or N 






10 

28 

30 

40 

58 

68 

180 
118 
120 
138 
148 
158 
168 
178 
188 
198 
208 
218 
220 
230 
248 
258 
500 
518 
520 
538 
600 
618 
628 
638 
648 
658 
668 
180 
101 
102 
183 
104 
185 
104 
107 


REM HHREEREEEEERERE 
REM * DANCING MEN *# 
REM HRREERERERER ERE 
REM 
KEY=500: OBSTACLE=400 
SETUP=1000: INITIAL=150@0: DETAILS=2000 
REM *#* THE MAIN PROGRAM #+# 

GOSUB DETAILS:60SUB INITIAL 

REPEAT 

: GOSUB SETUP 

: REPEAT 

K$=KEY$:IF K$<>"" THEN GOSUB KEY 
X=X+DX: Y=Y¥+DY: STATE=SCRN(X,Y)< OC 
PLOT X,Y,Z: AMOUNT=AMOUNT+1 

PLOT 35,1,MID$(STRS (AMOUNT) , 2) 

GOSUB OBSTACLE 
UNTIL STATE 
PLOT X,Y,128+Z:EXPLODE: WAIT 48 
PLOT 18,25,"Another go? Y or N" 
REPEAT: GET G$: UNTIL G$="Y" OR G$="N" 
UNTIL 6$="N" 

CLS:PRINT “Bye for now. "“:POKE #26A,3:END 
REM ## KEY ## 

K=ASC(K$): IF K<8 OR K>11 THEN RETURN 
DX=(K=8) - (K=9) s DY=(K=11)-(K=18) 

RETURN 

REM ## OBSTACLE ## 

IF RND(1)<.2 THEN RETURN 

REPEAT 

: A=INT(RND (1)#3442):BeINT(RND(1) #2143) 
UNTIL SCRN(A,B)=C 

PLOT A,B,168 

RETURN 
@ REM *#* SETUP #+# 
@ PAPER 6: INK @:CLS 
@ FOR X=1 TO 3d:PLOT X,2,16@:PLOT X,24,160:NEXT 
@ FOR Y=2 TO 24:PLOT 1,Y,16@:PLOT 36,Y,1460:NEXT 
@ X219sV=132:DX=OsDV=1i:PLOT X,Y,Z:STATE=FALSE 
@ PLOT X,Y,Z:STATE=FALSE: W=20: AMOUNT=1 
@ PLOT 0,25,4:PLOT 1,25,12 
@ PLOT 1,1,"DANCING MEN" 


37 


108@ PLOT 27,1," TOTAL: i" 

1098 RETURN 

150@ REM *# INITIALisation ## 

151@ START=#B400+38#8: AA=#A000 

152@ POKE AA,2:IF PEEK(AA)<>2 THEN START=START-#8000 
153@ FOR I=START TO START+7:READ R:POKE I,R:NEXT 
154@ 2=38:C=32 

155@ RETURN 

156@ DATA 14,14,4,31,14,14,18,18 

2008 REM *## DETAILS ## 

2801@ CLS:PAPER i:INK 7:PRINT 

2020 POKE #26A,2 ‘Disables cursor 

2038 ES=" "+CHR$(27): DS=E$t+"J"+CHR$ (4) 

2040 PRINT D$;SPC(ii); “DANCING MEN"“:PRINT D$:PRINT: PRINT 
2058 PRINT D$;SPC(7)s"by Czes Kosniowski":PRINT D$ 
2060 PRINT: PRINT "Make a chain of dancing men. Use the" 
2078 PRINT “cursor keys to change direction. "sPRINT 
208@ PRINT “But - watch out for the obstacles!" 

2098 PRINTSPRINT E$+"L"3SPC(9)3 "Press Y to play," 
210@ REPEAT: G$=KEY$:GG=RND(1):UNTIL G$="Y" 

2118 RETURN 


The main routine 


The main program draws a man and checks to see if it has hit an obstacle. 


The subroutines 


500 KEY 
This is used when a key is pressed. When a cursor key is pressed the 
computer calculates the direction in which the man should move. 


600 OBSTACLE 
This produces an obstacle (approximately 20% of the time). 


1000 SETUP 
A boundary wall is printed together with a man at location (19,13). 


1500 INITIAL 
One custom character, the man, is created. This replaces the character with 
ASC code 38. 


2000 DETAILS 
This contains brief details of the game. 


38 


9 Graphics Show 


Whenever you see an expensive business computer on display it always 
shows off some of its graphics facilities. Some of the patterns produced are 
very interesting and remarkably easy to produce on the ORIC. This program 
will show five different sorts of patterns. Each pattern uses several random 
numbers and so you should never see the same pattern twice. 

See Appendix 1 for some notes on saving HIRES pictures via your tape 
recorder. 





39 


10 REM HHHHHHHHHHHHHRRHEE 

2@ REM * GRAPHICS SHOW +# 

3O REM HHEHHRHHHHHERHHRHEHE 

4@ REM 

5@ INC=100: GRAPH=40@: CARRY=1000: ARCS=1100 


100 
118 
120 
13@ 
148 
158 
168 
170 
188 
198 
208 
218 
228 
238 
240 
258 
260 
278 
288 
298 
308 
500 
518 
520 
538 
548 


558 


568 
578 
580 
598 
600 
618 
620 
638 
648 


40 


REM ## THE MAIN PROGRAM *## 
INK 4:PAPER @:CLS 

REPEAT 

: TEXT: CLS:PRINT: Z=FRE(1) 
: ES=" "“+CHR$(27) : D$=E$+"JI"+CHR$ (4) 

: XMID=119:s YMID=99: DEF FNR(X)=INT(RND(1)#X)sPP&2#PI 
: PRINT D$;SPC(9);"GRAPHICS SHOW":PRINT D$ 

: PRINT:PRINT: PRINT D$3SPC (4); 

: PRINT “by Czes Kosniowski":PRINT D$:PRINT 

: PRINT “1. TWISTER": PRINT 

: PRINT "2. STAR":PRINT 

: PRINT “3. EYE"sPRINT 

: PRINT “4. THISTLE“:PRINT 

: PRINT "5S. MOIRE“s PRINT 

: PRINT “@. QUIT"“:PRINT 

: PRINT “Please enter the number of your choice" 

: REPEAT: G$=KEY$:GG=RND(1):UNTIL G$>="@" AND G$<"6" 
: G=VAL(G$):HIRES:POKE #26A,2 

: IF G>@ THEN GOSUB GRAPH+INC#6:GOSUB CARRY 

UNTIL G=@ 

TEXT:CLS:PRINT “Bye for now. "sPOKE #26A,3:END 

REM ## TWISTER ## 
A=.5-RND(1):B=.5-RND(1)sC=.5-RND (1): D2. 5-RND (1) 
PRINT SPC(14)3 "TWISTER": SH=15: XMID=XMID-SH 

FOR I=1 TO 25 STEP .25 

: X=XMID#SIN(A#I): YeYMID#COS (Bel) 

: CURSET X+XMID+SH,Y+YMID, 1 

: DRAW 1+XMID#SIN(C#I)-X,1L1+YMID#COS (D#1)-Y,1 

NEXT 

XMID=XMID+SH 

RETURN 

REM ## STAR ## 

PRINT SPC(16)3 "STAR": N=34FNR(7) s ANGLE=PP/N 
W=YMID#RND (1) sSTART=P1#(2#INT(M/2) =N-1)/2 

FOR I=YMID TO @ STEP -S5:X%=1#COS (START) 

: YZ2T#SIN(START) sCURSET XX+XMID,YX+YMID,1 


658 
668 
678 
688 
698 
708 
718 
720 
738 
740 
758 
768 
778 
788 
798 
808 
818 
820 
830 
840 
858 
840 
878 
880 
898 
900 
918 
920 
938 
940 
958 
968 
970 
980 
998 


: FOR J=START+ANGLE TO START+PP+ANGLE STEP ANGLE 
: U%=W#COS (J-ANGLE/2) : VZ=W#SIN(J-ANGLE/2) 
: DRAW U%-X%,V%-V%, 12 X%2U%2 V%=V%U%21#COS (I) 
:  VAEL#SIN(I) :DRAW UX-X%,VU-V%, Le XZ=U%2 VLEVE 
NEXT: NEXT: RETURN 

REM #* EYE ## 

PRINT SPC(16); "EYE" 
A=10+FNR(4@) :B=5Q+FNR (40) :N=1Q+FNR(4@) 
60SUB ARCS 

A= (A+B) /2:B=(B+YMID) /2 

FOR I=@ TO PP STEP PI/N 

: CURSET XMID+A#COS(1),YMID-A#SIN(I),1 

: DRAW (B-A)#COS(I), (BHA) #SIN(T) ,1 

NEXT 

RETURN 

REM ## THISTLE ## 

PRINT SPC(14)5; "THISTLE" 

A=10+FNR (48) rB=SO+FNR (40) :N=LO+ENR (48) 
GOSUB ARCS 

A=(A+B) /2:B=(B+YMID) /2 

FOR I=@ TO PI STEP PI/N 

: CURSET XMID-A#COS(I),YMID#A#SIN(I), 1 

: DRAW (B+A)#COS(I), (B-A)#SIN(I),1! 

NEXT 

RETURN 

REM ## MOIRE ## 

PRINT SPC(15) 5 "MOIRE" 

XMAX=224s YMAX#1991K21+5#RND (1) 

FOR I=@ TO XMAX STEP K 

: CURSET 15,0,1:DRAW I, YMAX,1 

NEXT 

FOR I=YMAX TO @ STEP -K 

: CURSET 15,@,1:DRAW XMAX,I,1 

NEXT 

RETURN 


1088 REM ## CARRY ON ## 

1010 PING:FOR I=1 TO 6:INK I: WAIT 75: NEXT 

1028 E¢=" "+CHR$(27) 

103@ PRINT E$+"B"+E$+"L Press Y to continue" 
104@ REPEAT:UNTIL KEY$="" 

1058 REPEAT:GET G$:UNTIL G$="Y" 


Al 


1060 HIRES: POKE #24A,2: RETURN 

11@@ REM ** ARCS #+# 

111@ FOR I=@ TO PP STEP PP/N 

1120 : CURSET XMID,YMID,1 

113@ : DRAW A#COS(PP-1) ,A#SIN(PP-I),1 
1140 : CURSET XMID,YMID,1 

1158 : DRAW BeCOS(PI/N+I) ,BeSIN(PI/N+I),1 
1148 NEXT 

1170 RETURN 


The main routine 


This is the main menu to find out which sort of pattern the operator wants 
created. 


The subroutines 


400 GRAPH 
There is no subroutine with this line number. The relevant subroutines are 
at intervals of 100 starting with line number 500. They are called by GOSUB 
GRAPH+INC*G where INC=100 and G is one of the numbers 1 - 5 typed by 
the operator. Details of these subroutines are given below. 

500 TWISTER consists of a sequence of straight lines that twist around the 
screen. 

600 STAR draws a random star with between 3 and 9 sides. The computer 
then fills in this region. 

700 EYE is a sequence of lines that partly fan out from the centre of the 
screen. The final effect is much like an eye. 

800 THISTLE is much like EYE. 

900 MOIRE consists of a sequence of straight lines that emanate from the 
top-left corner of the screen, slowly filling the whole screen. 


1000 CARRY 
This subroutine changes the colour of the picture and then asks if you want 
to carry on. 


1100 ARCS 
This is needed for some of the GRAPH subroutines. 


10 Square Nim 


Square nim is a game for two people. As the name suggests it is a disguised 
version of Nim. In case you've forgotten, Nim is that pick-up-sticks game in 
which you are presented with some piles of sticks. Each player, in turn, 
picks up some of the sticks from any one pile. The player picking up the last 
stick wins. 

In square nim we have a square board (something like a chess board). This 
has a letter A and a letter B in each row. One person is player A and the 
other player B. 

Each player, in turn, chooses a row and moves his or her letter along that 
row without jumping over the opponent's letter. The game ends when the 
letters in each row are next to each other. The player creating this state wins. 

The letter that is flashing can be moved by using the left or right cursor 
keys. If you want to move a different letter use the up or down cursor keys. 
The up and down cursor keys will only work if you have not yet moved your 
letter left or right. When you have moved your letter press Y for the next 
player’s turn. A letter must be moved before the Y key has any effect. 


x 
* 


* * * KK KK K 
* * ke ek DK *K * 
De * D*D* D * 


D*x* D* D* OD * 
* * kee * eK ED * 
ok ke kK eK KO eK D 
* * ee Ke DK * OD 
** OW * DO * * kK K * 
*x* * * OD kK eK Ke K OK OK 


* 
¥ 
* 
* 
* 
* 
* 
A 
* 
* 


* 
x 


* 
PLAYER - B 





43 


10 REM #H#HHHRHRERHHSEE 

2@ REM * SQUARE NIM # 

3O REM HHHHHHHHHE HEHE 

40 REM 

5@ FLASH=500: BIT=20: SETUP=100@: INFO=2000 

10@ REM *##* THE MAIN PROGRAM ## 

11@ GOSUB INFO:GOSUB SETUP 

120 REPEAT 

13@ : PLOT 8+2#X,5+2#Y,8: ZAP 

140 : C=-(NOT-C):ANSWER=FALSE 

158 : GOSUB FLASH+BIT 

160 : PLOT 10,25,X$(C):T=0 

178 : REPEAT 

180 : GET G$:G=ASC(G$) 

190 : PLOT 8+2#X,5+2#Y,8 

200 : IF G=8 AND C=@ AND X>@ THEN A(Y)=AC(Y)-1:T=T-1 

21@ : IF G=8 AND C=1 AND X>A(Y)+1 THEN B(Y)=B(Y)-1:T=T-1 
220 : IF G=9 AND C=@ AND X<B(Y)-1 THEN A(Y)=A(Y) +1: T=T+1 
230 : QIF G=9 AND C=1 AND X<9 THEN B(Y)=B(Y) +1: T=T+l 

240 : IF G=8 OR G=9 THEN GOSUB FLASH 


250 : IF G=1@ AND Y<? AND T=@ THEN Y=Y+1 
268 : IF G=11 AND Y>@ AND T=@ THEN Y=Y-1 
278 : IF G$="Y" AND T<>@ THEN ANSWER=TRUE 
288 : GOSUB FLASH+BIT 


290 : UNTIL ANSWER 

3@0 : REM CHECK FOR WIN 

31@ : STATE=TRUE 

3280 : FOR IT=@ TO 9:STATE=STATE# (A(T) =B(1)-1) : NEXT 
33@ UNTIL STATE 

34@ PING: WAIT 3@:ZAP:WAIT 30:PING 

358 PLOT 9,25,12:PLOT 23+C,25, "WINS" 

368 PLOT 7,3,CHR$(12)+CHR$(4)+"Another go? Y or N" 
37@ REPEAT:GET G$:UNTIL G$="Y" OR G$="N" 

380 IF G$="Y" THEN RUN 

39@ CLS:POKE #26A,3:PRINT “Bye for now. ":END 

508 REM ** FLASH #% 

S1i@ PLOT 94+2#X,5+2#Y,42 

928 X=C#B(Y)-(C=8) #A(Y) 

53@ PLOT 8+2#X,5+2#Y,12:PLOT 10+2#X,5+2#Y,8 

540 PLOT 9+2#X,5+2#Y,45+C 

55@ RETURN 


4 


1080 
1818 
1028 
1830 
1048 
1058 
1068 
1878 
1080 
10898 
1100 
1110 
1120 
2008 
2018 
2028 
2038 
2048 
2058 
2860 
2078 
2088 
2098 
2108 
2110 
2120 
2138 
2140 
2158 
2160 
2170 
2188 
2198 
2200 
2210 


REM ## SET UP ## 

PAPER 6: INK @:CLS:PRINT 

PRINT S$:PRINT D$:PRINT: PRINT 

FOR I=@ TO 9 

: PRINT SPC(7) 

: FOR J=@ TO 9:PRINT CHR$(136)+"#"5 2 NEXT 

: PRINT: PRINT: A(T) =INT(RND(1) #5) 

: BCI) =INTCRND (1) *#(9-ACI)) 4A(1) 41) 

: PLOT 9+2#A(1),5+2#1,65:PLOT 9+2#B(1) ,5+2#1,66 
NEXT 

X$(@)="FIRST PLAYER - A “sX$(1)="SECOND PLAYER - B" 
C=1:Y=@:PLOT 8,25,4 

RETURN 

REM ## INFOrmation ## 

CLSsPRINT:POKE #26A,2:PAPER 4: INK @ 

E$=" "4+CHR$(27) sDS$=E$+"JI“+CHRS$ (4) 


S$=D$+" SQUARE NIM" 

PRINT S$:PRINT D$:PRINT: PRINT 

PRINT D$+" by Czes Kosniowski":PRINT D$:PRINT 
PRINT "This is a game for two players, A & B." 


PRINT “Each player, in turn, chooses a row" 
PRINT “and moves his or her piece anywhere" 
PRINT “within that row, but without jumping" 
PRINT “over the opponents piece. The game" 
PRINT “ends when the pieces in each row are" 
PRINT "next to each other. The player creat-" 
PRINT “ing this state wins. "sPRINT 

PRINT “The piece that is flashing can be " 
PRINT “moved left or right with the cursor” 
PRINT “keys. If you want to move a different" 
PRINT “piece, use the other cursor keys. ":PRINT 
PRINT “When you are ready, press Y."“:PRINT 
PRINT ES+"L"+E$+"D"3SPC(4)3 "Press Y to play"; 
REPEAT: G$=KEY$:G6G6=RND(1): UNTIL G$="Y" 

RETURN 


The main routine 


The main loop responds to the key that has been pressed. 

The value of T determines whether or not a letter has been moved. 
ANSWER becomes TRUE when both T is non zero and the Y key has been 
pressed. 


45 


The subroutines 


500 FLASH 

This is used to flash the appropriate position on the screen. There is another 
subroutine embedded in this subroutine — this is accessed by using GOSUB 
FLASH+BIT, i.e. GOSUB 520. 


1000 SETUP 


This prints out the board and randomly positions the A’s and B’s in each 
row. 


2000 INFO 
A brief outline of the game is contained in this subroutine. 


il Oh! Susanna 


With this program the ORIC plays a tune and produces a random, colourful, 
pattern. Press @ when you want to quit the program. 


10 REM H#EHHHHHEHHHRHEES 


28 REM * OH! SUSANNA # 
38 REM HHHHHHHHHEHEEEE 


40 REM 

5@ INFO=580 

18@ REM *#* THE MAIN PROGRAM #+# 

11@ GOSUB INFO 

128 REPEAT 

138 : PLOT FNR(37) ,FNR(27) ,CHRS(FNR(7) +1) +CHRS(32+FNR(M) ) 
140 : [=I+it:IF 1558 THEN [=O:J=J+i:1F J>5 THEN J=1 

150 : B=INT((ACI)-1)/12) 

160 : IF ACI)>@ THEN MUSIC 1,J+B,A(I)-12#B,@:PLAY 3,@,1,L 
178 : WAIT S#T(1) 

18@ UNTIL KEY$="Q" 

19@ PLAY 8,8,0,8 

200 PRINT E$s"B"5E$3"L Another go? Y or N“sSPC(1@) 
218 REPEAT: GET G$:UNTIL G$="Y" OR G$="N" 

220 IF G$="Y" THEN RUN 

23@ CLS:PRINT "Bye for now. ":POKE #26A,3: INK 7: END 

5@@ REM ## INFOrmation #+# 

51@ INK S:PAPER @:CLS:DEF FNR(X)=INT(RND(1) #X) 

520 E¢=" “+CHR$ (27) :DS=E$+"I"+CHR$ (4): PRINT 

53@ PRINT D$;SPC(18);"OH! SUSANNA“: PRINT D$:PRINT: PRINT 
548 PRINT D$;SPC(4);"“by Czes Kosniowski":PRINT D$:PRINT 
558 PRINT “Watch the computer while it produces" 


47 


56@ PRINT "a random pattern and plays a tune.“:PRINT 
57@ PRINT “Press Y to start. "3 

58@ REPEAT:GET G$:UNTIL G$="Y" 

598 PRINTSPRINT:PRINT "Press @ to quit. "3 

600 DIM A(58),7T(58):FOR [=@ TO S8:READ ACI), T(I) NEXT 
618 IF 1(58)<>6 THEN PRINT “ERROR IN DATA! ":END 

628 CLS:POKE #246A,18:LORES 1:L2=2500:4=95 

63@ RETURN 

70@ DATA 6,1,8,1,10,2,13,1,13,3,15,1,13,2,18,2 

710 DATA 6,3,8,1,18,2,10,2,8,2,4,2,8,4,08,2,6,1 

72@ DATA 8,1,10,2,13,3,13,1,15,1,13,2,10,2,4,3 

730 DATA 8,1,10,2,10,2,8,2,8,2,6,46,0,2,11,4,11,4 

748 DATA 15,2,15,5,15,1,13,2,13,2,10,2,6,2,8,4 

758 DATA @,2,6,1,8,1,18,2,13,2,13,3,15,1,13,2 

768 DATA 180,2,6,3,8,1,10,2,18,2,8,2,8,2,6,6,8,6 


The main routine 


The main program plays a note and plots a random character from the 
alternate character set. The tune is played on a different scale each time. 
See Appendix 4 for some musical notes. 


The subroutine 


500 INFO 
This contains a brief description of the program. 

Following the description the DATA is read in. This. data consists of the 
note (stored in the array A(1)) and the time interval for which it should be 
played (stored in array T(1)). 

An error check line has been inserted to make sure that all the data is 
there. 


I? Stop’em 


There are twelve lights on the screen which may be on or off. At the start 
only one or two lights are on. The position of each light moves from left to 
right. When it reaches the end of the row it goes back to the beginning and 
repeats. The object is to switch the lights off by pressing any key. 

If the light in the marked position is on and you press a key then the light 
goes off. If it is off then it goes on. Thus, if you miss you have more lights on 
— all moving from left to right. Try to stop ‘em all. 





STOP ’EM 


BoOomenrpmsesomereodg& aoa 


“ 


Press the <space bar> to stop’em 





49 


10 REM #HeHREHEHE RE 
28 REM # STOP ‘EM # 
3O REM HHEHHRHRHRHRE 
4@ REM 

5@ SETUP=400: INFO=600 


100 
118 
120 
138 
148 
158 
148 
178 
188 
198 
208 
218 
220 
238 
248 
258 
268 
278 
400 
418 
420 
438 
440 
458 
468 
478 
480 
498 
580 
318 
680 
618 
420 
638 
648 
658 


50 


REM #* THE MAIN PROGRAM ## 
GOSUB INFO:STATE=FALSE:GOSUB SETUP 
REPEAT 
FOR K=@ TO 18 

WAIT ZZ:PRINT AS+CHR$(11) 

IF A$=B$ THEN STATE=TRUE 

AS=RIGHT$(A$,4) +LEFTS$(A$, 44) 

N=ASC (MID$(A$,23,1)) 

IF NOT STATE AND KEY$<>"" THEN N=71-(N-64 AND 7) 
AS=LEFT$(A$,22) +CHRS(N) +MID$ (A$, 24) 
NEXT 
WAIT RND(1)#20+1 
UNTIL STATE 
PING: WAIT 3O:PING:PRINT: PRINT SPC(14)3 "WELL DONE" 
PRINT:PRINT E$+"B"+E$+"L Another go? Y or N" 
REPEAT:GET G$:UNTIL G$="Y" OR G$="N" 

IF 6$="Y" THEN RUN 
CLS:PRINT “Bye for now.":POKE #26A,3:END 
REM ## SET UP ## 
PAPER @: INK 46:CLS:PRINT CHR$(4) 
PRINT E$+"J"sSPC(12); "STOP ‘EM"*:PRINT: PRINT CHR$(4) 
FOR I=@ TO 4:PRINT: NEXT 
PLOT 18,12,94 
POKE #26A,2 ‘Disables cursor 
FOR [=8 TO 11: BS=BS+E$+"F"+CHR$ (255) :NEXT 
AS=LEFT$(B$,22)+"A"+MID$ (BS, 24) 
AS=LEFT$(A$,14)+"A"+MID$ (A$, 14) 
AS=LEFT$(A$,2)+"A"+MID$(AS, 4) 
PLOT 4,146,"Press the <space bar> to stop ‘ea" 
RETURN 
REM ## INFOrmation ## 
PAPER @: INK 7:CLS 
E$=" “+CHR$(27):PRINT CHR$(4) 
PRINT E$t"J"s3SPC(1i)3 "STOP ‘EM"sPRINTSPRINT 
PRINTsPRINT ES+"J"sSPC(4)3 "by Czes Kosniowski" 
PRINTS: PRINT CHR$(4): PRINT: PRINT 


66@ PRINT “Press the space bar to change the" 

67@ PRINT “colour of the moving lights.":PRINT 

68@ PRINT "Try to make them cyan (light blue).":PRINT 
698 PRINT "At what speed do you want the lights" 

708 PRINT “to move? @ (fast) to 9 (slow): "35 

710 ‘REPEAT: G$=KEY$:GG=RND(1)sUNTIL G$<"s" AND G$>"/" 
728 ZZ=VAL(G$) +1 

73@ RETURN 


The main routine 


The lights are stored in the string A$. Each light occupies four characters. 
The moving effect is achieved by moving the last four characters (represent- 
ing the light on the right) to the front of A$. 

If a key is pressed then the light in the sixth position is changed. A light in 
that position is on if the value of N is 65, or off if it is 70. The statement N = 
71 - (N- 64 AND 7) changes 70 to 65 and vice versa. 

The speed with which the lights move from left to right is controlled by 
two WAIT statements. One is determined by the player, the other is random. 


The subroutines 


400 SETUP 
This creates the string A$ of lights with three lights on. The string B$ is the 
string of lights with all lights off. 


600 INFO 


This contains a brief description of the game. The player has an option to 
decide at what speed the lights move from left to right. 


51 


13 Round and Round 


With this program you can produce some spectacular curves. Technically 
speaking, the computer will plot the graphs of polar functions — but with a 
slight twist. The amount of twisting depends on the values of A and B that 
you input when requested to do so. 

See Appendix 1 for some notes about saving screen pictures via your tape 
recorder. 





52 


10 REM #H#eHRERHERESERE SESE 
20 REM * ROUND AND ROUND *# 
ZO REM HHHRHHREREEREESEREE 
4@ REM 

5@ PL=500 


100 
118 
128 
13@ 
148 
158 
168 
178 
188 
198 


200 : 


218 
228 
238 
248 
258 
508 
518 
528 
538 
548 
55@ 
568 
578 
588 
598 
608 
618 
628 
638 
648 
658 
668 
678 
68@ 
698 


REM ## THE MAIN PROGRAM ## 

INK 6:PAPER @:CLS:FOR I[=8 TO 6:READ AS(I): NEXT 
REPEAT 

: TEXT: CLSs:PRINT: ZZ=FRE(1) 

: E$=" "+CHR$(27) : DS$=E$+" J" +CHRS$ (4) 

: XMID=119: YMID=99: PP=2#PI 

: XRATIO=XMID#. 6: YRATIO=YMID#.9 

: PRINT D$;SPC(7);"ROUND AND ROUND“:PRINT D$ 

: PRINT:PRINT:PRINT D$;SPC(6)5; "by Czes Kosniowski" 
: PRINT D$:PRINT:PRINT “@ QUIT" 

: FOR [=8 TO S4:PRINT [+13" R = “sAS(T)ENEXT 

: PRINT:PRINT “Type in the number of the equation." 
: REPEAT: GET G$: UNTIL G$>="@" AND G$<"8" 

: G=VAL(6$)-1:I1F 6>=@ THEN GOSUB PL 

UNTIL 6<@ 

CLS:PRINT “Bye for now. "sEND 

REM * PLOTTING # 

PRINT SPC (17-LEN(A$(6))/2);A$(6) 

IF G=@ THEN DEF FNA(Z)=1 

IF G=1 THEN DEF FNA(Z)=SIN(2#Z) 

IF G=2 THEN DEF FNA(Z)=SIN(7#Z) 

IF G=3 THEN DEF FNA(Z)=(1+2#C0S(Z))/3 

IF G6=4 THEN DEF FNA(Z)=(1+C0S(Z))/2 

IF G=5 THEN DEF FNA(Z)=(1+SIN(2#Z))/2 

IF G=S THEN DEF FNA(Z)=(1+2#C0S(2#2))/3 

PRINT: PRINT “Type in values of A and B then press" 
PRINT “<return>. For standard plot use A=1" 

PRINT “and B=i."sPRINT: INPUT “Value of A“sA 

INPUT "Value of B";B 

HIRES: POKE #26A,2 

PRINT SPC(13-LEN(A$(6))/2)sAS(G)3" A="sA3" B="3B 
FOR Z=@ TO PP+.@1 STEP .@1 

: X=XMID+XRATIO#COS (A#Z) #FNA(Z) 

: Y2YMID+YRATIO#SIN(B#Z) #FNA(Z) 

: CURSET X,Y,1 

NEXT 


53 


700 PINGSFOR I=1 TO 6: INK I:WAIT 75:NEXT 

718 E$=" "+CHR$ (27) 

720 PRINT ESt+"B°+E$t"L Press Y to continue" 
73@ REPEAT: UNTIL KEY$="" 

748 REPEAT:GET G$:UNTIL G$="Y" 

758 RETURN 

808 DATA 1,SIN(2#Z) ,SIN(7#Z) ,1+2#COS(Z) ,1+COS(Z) 
818 DATA 1+SIN(2#Z) ,1+2#C0S5(2#2) 


The main routine 


This displays the various choices open to you — try them all. With option 1 
(and with A = 1 and B = 1) the result will be a circle. 


The subroutine 
500 PL 


This subroutine essentially plots the selected graph. On completion it waits 
for you to press Y which returns you to the main menu. 


54 


14 Cascade 


In cascade you have to get a ball to drop from the top of the screen to the 
bottom. A ball may be dropped from any one of ten positions by pressing 
one of the keys 0 to 9. 

There are several obstacles for your ball to overcome. If the ball hits an 
obstruction it may be reflected, deflected through a right angle or swallowed 
up. An 0 deflects the ball, an X reflects it while a solid red square eats it up. 

The obstructions may change when hit. 


CASCADE 
1 2 3 4 3 & 7 8 9? @ 
00,,00 X¥ 00 OX 00,,0% 00 XX 
0 0 f 
ae 





55 


10 REM *###eeeeHHRE 
2@ REM * CASCADE *# 
3Q REM HHHHHREHERE 
40 REM 


58 C 
100 
118 
120 
138 
142 
158 
148 
178 
188 
198 
200 
218 
220 
230 
240 
258 
268 
270 
288 
290 
308 
508 
518 
528 
538 
540 
55a 
1800 
1818 
1828 
1038 
1040 
1058 
1868 
1078 
1088 


56 


HANGE=50@: SETUP=1000: INFO=2800 
REM #* THE MAIN PROGRAM ## 
GOSUB INFO:GOSUB SETUP 
REPEAT 

: REPEAT:GET G$:UNTIL G$>"/" AND G$<":" 

: X=2+3#VAL (6$) -30#(G$="0") 

: Y=4:A=0:B=1 

: PLOT X,Y,Z 

: STATE=FALSE 

: REPEAT 
: U=X+A: V=Y+B:W=SCRN(U,V) 
: IF U<4 OR U>33 OR V4 THEN SHOOT: STATE=2 
: IF V>24 THEN PING:WAIT 20:PING:STATE=1 
: IF W>78 THEN GOSUB CHANGE 
: PLOT X,Y,32:X=X+A: Y=Y+B 
: IF STATE<2 THEN PLOT X,Y,2Z 
: UNTIL STATE 

UNTIL STATE=1 

PLOT 8,26,S$ 

REPEAT:GET G$:UNTIL G$="Y" OR GS$="N" 

IF 6$="Y" THEN RUN 

CLS:POQKE #26A,3:PRINT "Bye for now. "“:END 
REM ## CHANGE #+# 

IF W=255 THEN ZAP:STATE=2 

IF W=88 THEN A=-A:B=-B:PING 

IF W=79 THEN C=-B:B=A: A=C:PING 

PLOT U,V,A(FNR(P-3)) 

RETURN 

REM *## SET UP ## 

DEF FNR(X)=INT(RND(1) #X) 

PAPER @: INK 6:CLS:Z=126 

PRINT E$+"B"3SPC(12) 3 “CASCADE":PRINT 
PRINT E$+"B "3 

FOR T=1 TO 9:PRINT CHR$(48+1)3SPC(2)3:NEXT 
PRINT "@" 

P=7:FOR I1=8@ TO P-1:READ A(I):NEXT 

FOR J=4 TO 33 


1098 : IF J#INT(J/3)<>3-2 THEN PLOT J,4,A(1+FNR(2)) 
1188 NEXT 

1118 FOR I=5 TO 24 

1128 : PLOT 4,1,A(1) 

1130 : FOR J=4 TO 32 STEP & 

114@ : IF RND(1)<.5 THEN PLOT J+FNR(4),1,ACFNR(P)) 
1158 : NEXT 

116@ : PLOT 33,1,A(2) 

117@ NEXT 

1188 FOR J=5 TO 32 STEP 3:PLOT J,S+FNR(17) ,A(2) NEXT 
1198 S$=CHR$(2)+CHR$(12)+"Another go? Y or N" 

1288 RETURN 

1218 DATA 255,88,79,79,32,32,32 

2000 REM ## INFOrmation ## 

2010 PAPER @: INK 4:CLS:POKE #26A,2:PRINT 

2020 E$=" "+CHR$(27):DS=E$+"J"+CHR$ (4) 

2030 PRINT D$3SPC(12);"CASCADE":PRINT D$sPRINTsPRINT 
2048 PRINT D$;SPC(6)3"by Czes Kosniowski":PRINT D$:PRINT 
2058 PRINT “Try to get a ball to reach the bottoa." 
2060 PRINT "Press one of the keys @ to 9 te" 

2078 PRINT "release a ball. The obstructions will" 
2080 PRINT “either eat your ball, deflect it or" 
2090 PRINT "else reflect it.":PRINT 

2108 PRINT “The red squares eat a ball. The 0’s" 
2118 PRINT “deflect a ball and the X‘s reflect it." 


2120 PRINT E$+"B"+E$+"L- Press Y to start." 
213@ REPEAT: G$=KEY$:GG=RND(1): UNTIL G$="Y" 
2148 RETURN 


The main routine 


The ball continues to move until it meets an obstruction after which the 
direction of movement may change or the ball may be consumed. 

If STATE is FALSE then the ball is active. The value of STATE becomes NOT 
FALSE when it is either consumed or reaches the bottom of the screen. 

If STATE = 1 the game ends (unless you want to play again). If STATE = 2 
then your ball has been consumed and you have to try again. 


The subroutines 


500 CHANGE 
This is used when the ball meets an obstruction. It changes the direction in 
which the ball moves and the nature of the obstruction just met. 


57 


1000 SETUP 
A random arrangement of obstacles is produced by this subroutine. 


2000 INFO 
Brief details of the game are provided by this subroutine. 


58 


15 La Cucaracha 


Just a simple tune with some graphics portraying the notes. 


La Cucaracha 





59 


10 REM £HHHHHHRHHEHKEREES 

2@ REM * LA CUCARACHA * 

JO REM HHHHRRHERHHERERE 

48 REM 

5@ INFO=500 

10@ REM *#* THE MAIN PROGRAM ## 

11@ GOSUB INFO: J=2:K=0 

12@ REPEAT 

138 : T=I+it:sPLOT 14,24,"La Cucaracha" 

140 : IF I>MAX THEN [=O:J=J+i:CLS:INK J: IF J>5 THEN J=2 
15@ : B=INT((A(I)-1)/12) 

168 : K=K+i:IF A(I)=@ AND K>27 THEN K=@8:CLS 

17@ : PLOT K,24-A(1) ,95+63# (A(T) =@) 

18@ : IF AC(I)>@ THEN MUSIC 1,J+B,A(1)-12#B,@:PLAY 3,@,1,L 
198 : WAIT S*T(T) 

20@ UNTIL KEY$="Q" 

21@ PLAY 0,8,8,8 

228 PRINT ES$s"B"SE$ 3 "L Another go? Y or N"sSPC (18) 
23@ REPEAT:GET G$:UNTIL G$="Y" OR G$="N" 

248 IF G$="Y" THEN RUN 

25@ CLS:PRINT "Bye for now.":POKE #26A,3:INK 7: END 

5SQ@Q@ REM ## INFOrmation #+# 

518 INK 5:PAPER @:CLS:DEF FNR(X)=INT(RND(1) #X) 

520 E$=" "4CHR$(27): DS=E$t+"JI"+CHR$(4) sPRINT 

53@ PRINT D$;SPC(9);"LA CUCARACHA":PRINT D$sPRINT: PRINT 
548 PRINT D$;SPC(4)3"by Czes Kosniowski":PRINT D$:PRINT 
55@ PRINT "Just a simple tune..... .":sPRINT 

540 PRINT “Press Y to start......0. a 

57@ REPEAT:GET G$:UNTIL G$="Y" 

58@ PRINT:PRINT: PRINT “Press @ to quit. "$; 

598 DIM A(10@),T(100) sMAX=-1 

600 REPEAT: MAX=MAX+1:READ A(MAX) ,T(MAX) UNTIL A(MAX) #-1 
61@ IF MAX<>87 THEN PRINT "DATA ERROR": END 

628 MAX=MAX-1:CLS:POKE #26A,18: INK 6:L=2588 

63@ RETURN 

70@ DATA 8,1,8,1,8,1,13,3,17,1,8,1 

71@ DATA 8,1,8,1,8,1,13,3,17,5,8,1 

728 DATA 13,1,@,1 

73@ DATA 13,1,12,1,12,1,18,1,10,1,8,4,0,1 

740 DATA 8,1,8,1,8,1,12,3,15,1,8,1 

758 DATA 8,1,8,1,8,1,12,3,15,5,0,1 


60 


760 DATA 20,1,@,1 
77@ DATA 22,1,20,1,18,1,17,1,15,1,13,4,0,1 
78@ DATA 8,1,8,1,8,1,13,3,17,1,8,1 

79@ DATA 8,1,8,1,8,1,13,3,17,5,0,1 

B@@ DATA 13,1,0,1 

B10 DATA 13,1,12,1,12,1,18,1,10,1,8,4,@,1 
820 DATA 8,1,8,1,8,1,12,3,15,1,0,1 

830 DATA 8,1,8,1,8,1,12,3,15,5,0,1 

848 DATA 20,1,0,1 

Q5@ DATA 22,1,20,1,18,1,17,1,15,1,13,2 
860 DATA 13,1,13,1,13,1,0,6 

87@ DATA -1,-1 


The main routine 


As each note is played, a character is drawn at a suitable position on the 


screen. 
The notes are stored in the array A(1I) and the time interval for which 


they should be played is stored by T(1). 
Press @ to stop the program. 
See Appendix 4 for some musical notes. 


The subroutine 


500 INFO 
This contains the credits. The notes and time intervals are read into the 
arrays A(I) and T(1). 

A line for data error checking is included. 


61 


16 Clock Puzile 


This game is based on a sliding blocks puzzle invented by Czes Kosniowski 
and John Ewing (see Puzzle it out: Cubes, groups and puzzles published by 
Cambridge University Press). 

There are twelve counters, numbered 1 to 12, and one empty space ona 
board as shown below. 





The object is to move the counters around so that they appear in sequence 
as on a clock face. 


62 





The cursor keys are used to move the empty space around the playing 
area. 


The puzzle is lots of fun, at times infuriating and certainly not easy. 


li 12 
1Q@ CLOCK 
9 CLOCK 3 


8 CLOCK 


oe & 





63 


18 R 
20 R 
38 R 
48 R 
5@ 
180 
110 
128 
138 


140: 


158 
142 
178 
188 
198 
208 


210 : 


220 
238 
240 
258 
268 
278 
288 
298 
308 
318 
500 
518 
528 
1008 
1018 
1828 
1038 
1040 
1058 
1042 
1078 
1080 
1098 
1188 


64 


EM HERRHHHHHHEREREES 

EM * CLOCK PUZZLE +* 

EM HHXHRRHHEHEREEES 

EM 

OVE=500: SETUP=1000: INFO=2000 
REM *## THE MAIN PROGRAM #+# 
GOSUB INFO:GOSUB SETUP: STATE=FALSE 
REPEAT 

: ANSWER=FALSE 
REPEAT 
: REPEAT:GET G6$:G=ASC(G$):UNTIL G>7 AND 6<12 OR G=81 
: U=X+(G=8)-(6=9) :V=V¥+(G=11)-(6=18) 

: IF U>=@ AND U<3 AND V>=@ AND V<S THEN ANSWER=TRUE 
: IF U=i AND (V=i OR V=3) THEN ANSWER=FALSE 
: UNTIL ANSWER 
: W=S#U+VsP$(Z)=P$(W)sP$(W)=" " 
GOSUB MOVE: X=U:Y=V:Z=W:GOSUB MOVE 

: STATE=TRUE 

: FOR I=@ TO 14:STATE=STATE* (P$(1)=Q$(1)) 2 NEXT 
: IF G=81 THEN STATE=2 

UNTIL STATE 

IF STATE<2 THEN PING: WAIT 3@:PING: 

PLOT 24,1,CHR$(12)+CHR$(2)+"Another go?" 
PLOT 26,3,CHR$(12)+CHR$(2)+"Y or N" 
REPEAT: GET 6G$:UNTIL G$="Y" OR G$="N" 

IF 6$="¥" THEN RUN 
CLS:POKE #26A,3:PRINT "Bye for now. ":END 
REM ** MOVE ## 
PLOT 6+5#X,24+5#Y,P$(Z)sPLOT S+5#X,3+5#Y,P$(Z) 
RETURN 

REM *# SET UP ## 

E$=CHR$ (27) : F$=CHR$ (255) 

PAPER @: INK 7:CLS 

BS=" "FE$S+"D"+F $s XS=ES+"B"+BE 
AS=BS+X$+X$+X$: YS=BS 

FOR I1=8 TO 4: Y$=YS+F$: NEXT 
CS=BStE$t+"B"+V$S4X$ 

FOR 1=8 TO 14:BS$3B$+F$: NEXT 

REM PRINT BOARD 

PRINT CHR$(30)+B$ 

FOR I=@ TO 4:FOR J=i TO 5 


1118 
1128 
1138 
1140 
1158 
1168 
1178 
1182 
1198 
1280 
1218 
1220 
1238 
1248 
1250 
1240 
1278 
1288 
1298 
1300 
1310 
1320 
1330 
1348 
1358 
1348 
1370 
1880 
2000 
2018 
2020 
2038 
2040 
2058 
2042 
2078 
2088 
2090 
2100 
2118 
2120 


: IF 2#INT(I/2)=I AND J<5 THEN PRINT A$ 

: IF 2*INT(I/2)<>1 AND J<5 THEN PRINT C$ 

: IF J=5 THEN PRINT B$ 

NEXT: NEXT 

R$=CHR$(1):PLOT 25,4,R$+"11 12 | Nia 

PLOT 25,9,R$+"10 CLOCK 2":PLOT 25,12,R$+" 9 CLOCK 3" 
PLOT 25,15,R$+" 8 CLOCK 4" 

PLOT 25,18,R$+" 7 4 a" 

REM THE PIECES 

DIM P$(14) ,Q$(14) 

FOR I=1 TO 9:P$(1I)=" “+CHR$(48+1) sNEXT 

FOR [=@ TO 2:P$(10+1)="1"+CHR$(48+1): NEXT 
P$(O)=" "SP$(13)=FS+F$ 

FOR [=@ TO 14:READ K:Q$(1)=P$(K) NEXT 

FOR I=@ TO 14:P$(1)=Q$(1) NEXT 

REM MIXING 

FOR I=1 TO 10 

: K=INTCRND(1)#6)+9#INT(RND (1) #2) 

: L=INT(RND(1)#46)+9#INT(RND (1) #2) 

: R$=P$(K)sP$(K)=P$(L) sP$(L) =RF 

NEXT 

REM DISPLAY PIECES 

FOR X=@ TO 2:FOR Y=@ TO 4 

: Z=5#X+Y:GOSUB MOVE 

NEXT: NEXT 

X=1:Y=2:2=7 

RETURN 

DATA 11,10,9,8,7,12,13,0,13,6,1,2,3,4,5 

REM ** INFOrmation #*+# 

E$=" "4+CHR$(27):PAPER @: INK 7:CLSsPRINT CHR$(4) 
PRINT E$+"J"3SPC(11)3 "CLOCK PUZZLE":PRINT: PRINT 
PRINT: PRINT E$t+"J"3SPC(8)3 "by Czes Kosniowski" 
PRINT CHR$(4):PRINT 

PRINT “Rearrange the numbers on the clock" 
PRINT "face into their correct postion." 

PRINT: PRINT "Use the cursor keys to move the empty" 
PRINT “space. "s;E$t"A Press @ to Quit":PRINT: PRINT 
PRINT E$+"L"+E$+"B Press Y to play" 

POKE #26A,2 ‘Disables cursor 

REPEAT: G$=KEY$:GG=RND(1):UNTIL G$="Y" 

RETURN 


65 


The main routine 


There are two parts to the main routine. The first part waits for one of the 
cursor keys (ASC values 8 to 11) or the @ key (ASC value 81) to be pressed. Ifa 
cursor key is pressed, and if it indicates a valid position for the empty space 
to occupy then a move is made. If @ is pressed the game terminates. 

The second part checks to see if the squares are in the correct positions. 


The subroutines 


500 MOVE 
This simply plots the appropriate number (or empty space) where it is 
needed. 


1000 SETUP 
This is a rather long but straightforward subroutine to produce the square 
clock display. 

In addition, the computer mixes up the pieces ready for play. 

Note. If you decide to alter the number of times the computer mixes up 
the pieces, make sure that it is still an even number of times. If this number is 
odd then the puzzle becomes impossible to solve! 


2000 INFO 
Brief details of the game are contained in this subroutine. 


66 


17 Blank Out 


There are nine windows numbered 1 to 9. The curtains are drawn open. A 
lady walks behind these windows shining a light. She walks from window 1 
to 9 and then jumps back to window 1 and repeats the process. If she is 
behind a window when you press the corresponding number of the 
window, then the curtains are closed. The object of the game is to draw all 
the curtains. 

Note. There is a small bug in the program whereby you can cheat if you 
want to — details will not be given. 


{286 RRR 33538 


BLANK OUT 
Press the right key at the right time 





67 


18 R 
20 R 
38 R 
4@R 
58 B 
100 
118 
128 
130 
148 


158 : 


168 
178 
188 
198 
200 
218 
228 
508 
518 
528 
538 
548 
1000 
1010 
1820 
1038 
1048 
1850 
10840 
1878 
1088 
1898 
1188 
1118 
1128 
1130 
2000 
2018 
2028 
2838 


68 


EM HHERHHHHERE RH 
EM * BLANK OUT # 
EM #HHHERHHHEHES 
EM 
LANK=50@0: SETUP=1000: INFO=2000 
REM #*# THE MAIN PROGRAM #+# 
GOSUB INFO:GOSUB SETUP 
REPEAT 
: PLOT X(C),Y,Z(C) 
: CaC+i:IF C9 THEN C=1i:WAIT 1+RND(1) #20 
PLOT X(C),Y,W(C)SWAIT ZZ 
: IF KEY$=CHR$(Z(C)) THEN GOSUB BLANK 
UNTIL STATE 
PING: WAIT 2@:PING 
PRINTSPRINTSPRINT E$+"L Another go? Y or N" 
REPEAT:GET G$:UNTIL G$="Y" OR G$="N" 
IF G$="Y" THEN RUN 
POKE #26A,3:CLS: INK 7:PRINT “Bye for now. ":END 
REM ## BLANK ## 
Z(C)=32 
FOR I=-1 TO isPLOT X(C)-1,Y+tI," "SNEXT 
W(C)=32:MM=MM+1:IF MM>8 THEN STATE=TRUE 
RETURN 
REM ## SET UP #+# 
PAPER @: INK 2:CLS 
PRINT: PRINT: PRINT: PRINT 
FOR T=1 TO 9sX(1)=4#1-2:72(1) =48+2:W(1)=255: NEXT 
FOR J=8 TO 2:FOR I=1 TO 9 
: FOR K=@ TO 2:PRINT CHR$(Z(1))3:NEXT 
: PRINT " "3 
NEXT: PRINT: NEXT 
Y=5: Z=255:C=1:MM=0 
POKE #26A,2 ‘Disables cursor 
PLOT 13,11,CHR$(4)+"BLANK QUT" 
PLOT 0,13,"Press the right key at the right time" 
STATE=FALSE 
RETURN 
REM ## INFOrmation #+# 
PAPER @: INK 7:CLS:PRINT CHR$(4) 
E$=" "“+CHR$(27) 
PRINT E$+"J"sSPC (10) 3 "BLANK OUT":PRINT: PRINT 


2040 PRINT: PRINT E$+"J"3SPC(6)3;"by Czes Kosniowski" 
2058 PRINT CHR$(4):PRINT: PRINT 

2068 PRINT "Blank out the numbered windows by" 

2070 PRINT “pressing the right key at the right" 

2088 PRINT “time. "3SPC(5)+E$+"AGOOD LUCK": PRINT 

2098 PRINT:PRINT “At what speed do you want to play?" 
2108 PRINT "@ (fast) to 9 (slow) "$5 

2118 REPEAT: G$=KEY$:GG=RND(1):UNTIL G$>"/" AND G$<":" 
2128 ZZ=VAL(G$) +1 

213@ RETURN 


The main routine 


The main loop checks to see if the correct key has been pressed. 


The subroutines 


500 BLANK 

This draws the curtain in the appropriate window, i.e. blanks out the 
display. Curtain number C is shut if W(C) = 32. It is open if W(C) = 255. The 
reason is that CHR$(32) is a blank square while CHR$(255) is a solid, 
coloured square. 


1000 SETUP 
The array X(1) stores the position of window I. The array W(1) stores the 
information about whether the curtain in window I is open or not. 


2000 INFO 
This subroutine prints out brief instructions for the game. In addition the 
player is asked for the speed of play. 


69 


18 Surfaces 


This is a short program which produces some vivid three-dimensional 
pictures of surfaces. 

Note. The whole process is quite time consuming but well worth the wait. 
If desired you could save the result on tape so that you wouldn’t have to 
replot every time. See Appendix 1 for further details. 





70 


10 REM HH#HRHREHHHRE 
20 REM * SURFACES * 
3B REM HHHHHHHRHREE 
48 REM 

58 PL=500 


108 
110 
128 
130 
140 
158 
140 
178 
188 
198 
208 
210 
228 
230 
248 
250 
268 
508 
518 
520 
538 
540 
558 
568 
578 
580 
598 
608 
618 
628 
638 
648 
658 
668 
678 
680 


REM ## THE MAIN PROGRAM ## 

INK 6:PAPER @:CLS:FOR I=@ TO S:READ A$(I):NEXT 
REPEAT 

: TEXT: CLSs:PRINT: ZZ=FRE (1) 

: E$=" "“4CHR$(27) :DS=E$+"J"+CHR$ (4) 

: XMID=119: YMID=99:PP=2#PI:S=SQR(2)/2:SS=XMID#s 
:-PRINT D$;SPC(11);"“SURFACES":PRINT D$ 

PRINT: PRINT 

: PRINT D$;SPC(6)3"by Czes Kosniowski" 

PRINT D$:PRINT 

: FOR I=8 TO SsPRINT Is A$(1)s PRINT: NEXT 

: PLOT 26,11,"“where":PLOT 22,13, "R=SQR(X#X+Y#Y) " 
: PRINTsPRINT "Please type in your selection. "3 
: REPEAT: GET G$:UNTIL G$>="@8" AND G$<"7" 

: G=VAL(6$):1F G>@ THEN GOSUB PL 

UNTIL 6=8 

CLS:PRINT "Bye for now. ": END 

REM ## PLotting #+# 

HIRES: POKE #26A,2 

PRINT SPC(18-LEN(A$(G))/2) 3A$(G) 

FOR A=-SS TO SS+5#S 

: MAX=-YMID: TT=SS+A-10#S5#INT( (A+ABS(A)) /18/S) 

: FOR B=-TT TO TT+S#4 STEP 10#S 

: X=$#(A+B): Y=S#(B-A) :s Z=BsR=SOR(X#X+YV#Y) 

: IF G=i THEN Z=12#COS(R/5) +B 

: IF G=2 THEN Z=YMID#EXP(-R#R/ 488) +B 

: IF G=3 AND R<>@ THEN Z=2*XMID#SIN(R/S) /R+B 

: IF G=4THEN 2=12#COS(X/10) *#COS(Y/10) +B 

: IF G=5 AND R<>B THEN Z=X#V#(X-Y¥) #(X+Y) /(1808#R) +B 
: FB=1:1IF Z<MAX THEN FB=3 ELSE MAX=2Z 

: U=XMID+tA: V=YMID-Z#S 

: IF V>1 AND V<2#YMID THEN CURSET U,V,FB 

: NEXT 

NEXT 

PING:FOR I=1 TO 6: INK IsWAIT 75sNEXTsE$=" “+CHR$(27) 
PRINT ES+"B°+E$+"L Press Y to continue" 


71 


69@ REPEAT: UNTIL KEY$="" 

700 REPEAT:GET G$: UNTIL G$="Y" 

71@ RETURN 

B8@@ DATA QUIT,Z = COS(R),Z = EXP(-R#R) 
810 DATA Z = SIN(R)/R,Z = COS(X)#COS(Y) 
828 DATA The monkey saddle 


The main routine 


The main menu to the program is presented. You are asked to select the 
surface you want plotted. 


The subroutine 


500 PL 

This plots the selected surface. The picture is put into perspective by using the 
variables A, B, and X, Y. Hidden points are not plotted, this is achieved by 
checking whether the current point to be plotted is less than MAX or not. 


72 


19 Blue Danube 


Just a simple tune, with apologies to Strauss. 
See Appendix 4 for some general musical notes. 


10 REM HEHHHHHRHRHHERE 
2@ REM * BLUE DANUBE # 
3O REM HHHHERERERREEEE 
4@ REM 

5@ INFO=500 


100 
118 
120 
130 
148 
158 
140 
178 
188 
198 
208 
218 
228 
238 
248 
588 
518 
520 
538 
548 


REM #*# THE MAIN PROGRAM #+# 

GOSUB INFO: J=3:K=0 

REPEAT 

: PLOT 6+A(I),26-A(I) ,32 

: T=f+i1:1F I>MAX THEN [=O:J2J+i2 IF J>5 THEN J=3 

: B=INT((AC(I)-1)/12) 

: PLOT 6+A(I),26-A(I) , 144d 

: IF ACI)>@ THEN MUSIC 1,J+B,A(I)-12*B,@:PLAY 1,0,1,L 
: WAIT B8#T(T) 

UNTIL KEY$="Q" 

PLAY 0,8,8, 

PRINT ES; "“B"3E$3 "L Another go? Y or N"3SPC(18) 
REPEAT: GET G$:UNTIL 6$="Y" OR G$="N" 

IF 6$="Y" THEN RUN 

CLS:PRINT “Bye for now. "sPOKE #246A,3: INK 7sEND 

REM ## INFOrmation ## 

INK SsPAPER @sCLS:DEF FNR(X)=INT(RND(1) #X) 

E$=" "+CHR$(27) s DS=E$+"J"+CHR$( 4): PRINT 

PRINT D$sSPC(9)s "BLUE DANUBE“:PRINT D$:PRINT: PRINT 
PRINT D$;SPC(6); "by Czes Kosniowski":PRINT D$:PRINT 


73 


558 
568 
578 
580 
598 
680 
618 
620 
638 
640 
708 
710 
720 
730 
748 
750 
760 
770 
788 


PRINT "Just a simple tune...... "sPRINT 

PRINT “Press Y to start....00.."3 

REPEAT: GET G$: UNTIL G$="Y" 

PRINT:PRINT: PRINT “Press @ to quit. "3; 

DIM A(1O00),1T(100):MAX=-1 

REPEAT: MAX=MAX4+1:READ A(MAX) ,T(MAX): UNTIL A(MAX)=-1 
IF MAX<>69 THEN PRINT “DATA ERROR": END 
MAX=MAX-1:CLS:POKE #26A,10: INK 6:L=2500 

PRINT: PRINT D$3SPC(9);"BLUE DANUBE":PRINT D$ 


RETURN 
DATA 1,2,1,2,5,2,8,2,8,4,20,2,20,4,17,2,17,4 
DATA 1,2,1,2,5,2,8,2,8,4,20,2,20,4,18,2,18,4 
DATA 3,2,3,2,6,2y18,2,10,4,22,2,22,4,18,2,18,4 
DATA 3,2,3,2,6,2,10,2,10,4,22,2,22,4,17,2,17,4 
DATA 1,2,1,2,5,2,8,2,13,4,25,2,2544,20,2, 20,4 
DATA 1,2,1,2,5,2,8,2,13,4,25,2,25,44 22422244 
DATA 3,2,3,2,6,2,10,2,10,7,7,2,8,2,17,8 

DATA 13,2,5,2)5,4,3)2,18,4,8,2,1,6 

DATA -1,-1 


The main routine 


This plays each note for the required length of time. At the same time the 
pitch of the note being played is displayed graphically. 
Each time the tune is played the key is changed. 


The subroutine 


500 INFO 
The credits are contained here. When these are finished the program reads 
the necessary DATA, i.e. the notes and time intervals. 


74. 


20 Snake 


This program is an action game in which you have to control a creature (a 
snake) using the cursor keys. Try to make the snake eat the food but avoid 
the rocks and wall (the edge of the screen). In addition don’t crash into 
yourself. Each time the snake eats some food it gets longer and moves a little 
more sedately. Success is achieved when the snake is 10 units long. It’s quite 
addictive trying to feed that ever-hungry growing snake. 





75 


10 REM #4448222 

28 REM # SNAKE +# 

38 REM ###eR RHEE 

4@ REM 

5@ CHECK=40@: DIRECT=500: FOOD=400 
68 SETUP=1000: CAR=1200: INFO=2000 


100 
118 
128 
138 
148 
158 
168 
178 
188 
198 
200 
218 
220 
230 
248 
258 
400 
418 
420 
430 
440 
588 
518 
528 
530 
600 
618 
628 
630 
648 
658 
668 


REM *#* THE MAIN PROGRAM #+# 

GOSUB INFO:GOSUB SETUP: GOSUB FOOD 

REPEAT 

’ K$=KEY$:IF K$<>"" THEN GOSUB DIRECT 

: FOR Ist TO 1 STEP -isP(1)=P(I-1):Q(1)=Q(1-1) NEXT 
: P(@)=P(8)+DP:@(@)=@(8)+DG:PQ=SCRN(P (8) ,8(@)) 

: PLOT P(@),Q(8),RsPLOT P(L) ,Q(L),32 

: IF P@<>32 THEN GOSUB CHECK 

UNTIL STATE OR L>18 

IF L>1@ THEN PLOT 15,0,"WELL DONE"“:PING: WAIT 10:PING 
IF STATE THEN PLOT 17,0,"SPLAT":PAPER 1 

WAIT 2@:PAPER @:PRINT 

PRINT E$+"L"3SPC(8)3;"Another go? Y or N";SPC(18) 
REPEAT: GET G$:UNTIL 6$="Y" OR G$="N" 

IF G$="Y" THEN RUN 

CLS:PRINT “Bye for now. "“:POKE #26A,3: INK 7:END 
REM ## CHECK ## 

IF P@=R THEN SHOOT: STATE=1 

IF PQ=W THEN EXPLODE: STATE=2 

IF P@=C THEN ZAP:GOSUB FOOD 

RETURN 

REM #* DIRECTion ## 

KK2ASC(K$): IF KK<8 OR KK>11 THEN RETURN 
DP=(KK=8) -(KK=9) : DQ=(KK=11)-(KK=1@) 

RETURN 

REM #* FOOD #+# 

FOR I=8 TO 3 

REPEAT: A=FNR (36) +2: B2FNR(25) +i: UNTIL SCRN(A,B)=32 
IF I#®@ THEN PLOT A,B,C:L=L+1 

IF I>@ THEN PLOT A,B,W 

NEXT 

RETURN 


1008 REM ## SETUP #+# 
101@ PAPER @: INK 2:CLS:R=37:DIM P(28) ,Q(20):W=255 
1028 FOR X=1 TO 38:PLOT X,@,WsPLOT X,26,W:NEXT 


76 


1038 
1048 
1058 
10848 
10872 
1088 
1098 
1180 
1208 
1210 
1220 
1300 
1318 
2000 
2018 
2828 
20308 
2040 
2058 
2068 
2678 
2080 
2890 
2108 
2118 
2128 
2130 


FOR Y=1 TO 25:PLOT 1,Y,W:PLOT 38,Y,Ws:NEXT 
P(O)=30:P(1)=312P(2)=32:0(0)=22:0(1)=22:0(2) =22 
L=1:FOR I=@ TO L:PLOT P(I),Q(1) ,ReNEXT 
DP=-1:DQ=0:C=38: START=#B400+R*#8: AA=#A080 

POKE AA,2:1F PEEK(AA)<>2 THEN START=START-#8000 
GOSUB CAR: START=START+8:60SUB CAR 

STATE=8 

RETURN 

REM ## CAR ## 

FOR I=START TO START+7:READ XsPOKE I,X:NEXT 
RETURN 

DATA 12,12,30,63,63,30,12,12 

DATA 21,21,14,14,4,4,4,4 

REM *#* INFOrmation #*# 

INK 46:PAPER @:CLS: DEF FNR(X)=INT(RND(1) #X) 

E$=" "4+CHR$(27) :D$=E$+"J"+CHR$(4) SPRINT 

PRINT D$;SPC(12);“SNAKE":PRINT D$:PRINT: PRINT 
PRINT D$;SPC(6)3"by Czes Kosniowski":PRINT D$:PRINT 
PRINT “Guide the SNAKE to the food. "“:PRINT 
PRINT “But - avoid the obstructions and the" 
PRINT “wall. Also don’t run into yourself! ":PRINT 
PRINT “To CHANGE direction use the cursor" 
PRINT “keys. “:PRINT 

PRINT "Press Y to start..... ears 

REPEAT: G$=KEY$: GG=RND(1):UNTIL G$="Y" 

POKE #26A,2 

RETURN 


The main routine 


The snake continues to move unless it hits an obstacle. The direction in 
which the snake moves is changed by using the cursor keys. The main 
routine scans the keyboard and changes the direction of the snake if 
appropriate. It also checks to see if the snake has met an obstacle. 


The subroutines 


400 CHECK 
If the head of the snake moves to a position which is not an empty space 
(ASC code 32) then this subroutine is used. The snake can either hit a rock or 


77 


wall (when P@ = W), or crash into itself (when P@ = R) or eat some food (when 
PQ=C). 


500 DIRECT 
This subroutine is called into play when a key is pressed. If one of the cursor 
keys is pressed then the corresponding direction of movement is calculated. 


600 FOOD 
Not only does this subroutine decide where to place some food, it also 
places two rocks on the screen. 


1000 SETUP 
This draws the surrounding wall and creates two custom characters (for the 
snake and food). 


1200 CAR 
This is a short subroutine to read the DATA and POKE it into the appropriate 
place for the custom characters. 


2000 INFO 
Brief details of the game are in this subroutine. 


78 


Zi Space Chase 


Deep in outer space you are the pilot of a space ship. Because of a shortage 
of fuel, you need to guide the space ship towards the energy sources which 
occasionally pass by. These energy sources look like asterisks. 

A recent planetary explosion has left a lot of debris around which you 
must avoid. Your space ship is on full thrust and you can control movement 
by using the left and right cursor keys. ; 





79 


10 REM #HHHHHHHEREREERE 

28 REM * SPACE CHASE *# 

SO REM HHHHHRHRHHREREE 

4@ REM 

5@ HIT=50@: SETUP=1000: INSTRUCT=2008 
108 REM ## THE MAIN PROGRAM #+% 

118 GOSUB INSTRUCT:GOSUB SETUP 

128 REPEAT 


13@ : PLOT 39#RND(1),@,38 
140 : FOR I=1 TO 20 
15@ : PLOT 39#RND(1),@,46:PLOT X,Y,32:PRINT CHR$(11); 


178 IF X<38 AND PEEK(769)=127 THEN X=X+1 

188 XY=SCRN(X,Y)sIF XY=46 OR XY=38 THEN GOSUB HIT 
198 PLOT X,Y,37 

208 : NEXT 

218 UNTIL COUNT>=MAX 

220 FOR 128 TO 39:POKE TP+1,32:NEXT 

23@ PRINT CHR$(4) 

248 PRINT E$+"J"+E$+"B"3SPC(8); "YOUR SCORE: “3SC 

258 PRINTsPRINT: PRINT: WAIT 208 

268 PRINT E$+"N"+E$+"A Another go? Yor N 

278 PRINT CHR$(4) 

28@ REPEAT: GET K$: UNTIL K@="Y" OR K$="N" 

298 IF K$="Y" THEN RUN 

308 POKE #246A,3:CLS:PRINT “Bye for now. "sEND 

500 REM #*# HIT #% 

51@ IF XY¥=46 THEN EXPLODE:PAPERI:WAIT 2@:COUNT=COUNT+1 
520 POKE TP+39,48+MAX-COUNT 

53@ IF XY¥=38 THEN PING: PAPER 2:WAIT 20:PING:SC=SC+258 
548 PAPER 3:WAIT 2@:PAPER @ 

55@ IF RND(1)<.5 THEN PLOT 39#RND(1) ,@,38 

56@ FOR I=2 TO LEN(STR$(SC)) 

578 : POKE TP+I-1,48+VAL (MID$(STR$(SC) ,1,1)) 

588 NEXT 

598 RETURN 

1000 REM #* SETUP ## 

101@ X=18:¥=21: COUNT=@: SC=8: AA=#A800:0=0 

1020 POKE AA,2:IF PEEK(AA)<>2 THEN @=#8000 

1838 START=46080+37#8-Q: TP=#BB80-Q 

1048 FCR 128 TO 7:READ J:POKE START+I,J:NEXT 


3 
168 : IF X>@ AND PEEK(769)=223 THEN X=X-1 
: 


80 


1058 FOR I=@ TO 7:READ J:POKE START+8+1,d:NEXT 

1068 FOR [=36 TO 39:POKE TP+I,32:NEXT 

1070 POKE TP+39,48+MAX: INK 7:PAPER @:CLS 

108@ RETURN 

110@ DATA 45,63,45,12,12,45,63,45 

1110 DATA 33,18,12,63,63,12,18,33 

2000 REM ** INSTRUCTions #*# 

2010 E$=" "“+CHR$(27):CLS:POKE #26A,108 

2020 INK 7:PAPER 1:CLS:PRINT CHRS#(4) 

2030 PRINT E$+"J"+E$+"@"3SPC(8); "SPACE CHASE" 

2040 PRINT:PRINTsPRINT: WAIT 28 

20508 PRINT E$+"J"+E$+"D by Czes Kosniowski" 

20460 PRINT CHR$(4):PRINT 

2078 PRINT:PRINT “Pilot your space ship towards the " 
2088 PRINT “energy sources - but be careful to" 

2098 PRINT “avoid the cosmic debris ....." 

210@ PRINT: PRINT “Use the left and right cursor keys” 
2118 PRINT "to move. 600D LUCK" 

212@ PRINT: PRINT 

2130 PRINT E$+"@ Number of crashes allowed?" 

2140 PRINT E$+"@Type a number between 1 and 9." 

2150 REPEAT: 6$=KEY$:G6G=RND(1):UNTIL G$>"@" AND G$<":" 
21468 MAX=VAL(G$):PING: WAIT 30:PING 

2170 RETURN 


The main routine 


The screen is scrolled down (not up) one line by use of the command PRINT 
CHR$(11). On each scroll some cosmic debris is deposited on the top line 
via the command PLOT 39*RND(1),0,38 

PEEK(769) reads the keyboard. If the left cursor key has been pressed 
this has a value of 223 (other keys also have the same value). The right 
cursor key has a value of 127. The use of PEEK(769) is faster than using the 
command KEYS. 

The whole process continues until the space ship has hit some 
predetermined amount of cosmic debris. 


The subroutines 


500 HIT 
If the space ship hits something then this subroutine comes into play. It 


81 


updates (with sound effects) the number of crashes and energy source hits. 
The current score is POKEd into the top line of the screen usually used for 
system messages. 


1000 SETUP 
This initializes the counters and creates two custom characters, the space 
ship and the energy sources. 


2000 INSTRUCT 


This gives brief details about the game. You are also asked how many 
crashes are permitted before a game ends. 


82 


22 Spell it 


In this game a word is flashed onto the screen for a brief moment. Look 
carefully because you will have to spell it out. In order to help you, you have 
some control over how quickly the word is flashed on the screen. 


SPELL IT 
WORD 8 


Type out the word and press “return? 


? CUPBORED 


No, the answer is CUPBOARD 
Fress Y to continue 





83 


1@ R 
28 R 
38 R 
40 R 
5@ 5 
100 
118 
128 
138 
148 
158 


168 : 


170 
188 


198 : 


208 
218 
220 
238 
248 
258 
268 
278 
280 
290 
300 
588 
518 
528 
938 
1808 
1018 
10820 
1030 
1040 
1100 
1118 
1128 
1138 
1140 
1158 


84 


EM HHHRHHHRHH ES 

EM * SPELL IT # 

EM HHHHHHHHRHHE 

EM 

PELL=500: SETUP=1000: INFO=2000 

REM #* THE MAIN PROGRAM #+# 

GOSUB INFO:GOSUB SETUP 

FOR I=1 TO 18 

: AS=R$(INT(RND (1) #MAX)) 

: GOSUB SPELL: PING: WAIT S@:PING:PRINT: PRINT 

: PRINT SPC(16-LEN(A$) /2) ;D$+A$ 

PRINT D$: WAIT T:GOSUB SPELL: PRINT 

: PRINT: PRINT “Type out the word and press <return>" 
: PRINT: PRINT SPC(13);: INPUT B$¢ 

PRINTS PRINT: PRINT: PRINT 

: IF A$=B$ THEN PING: SC=SC+1:PLOT 14,12,"WELL DONE" 
: IF A$<>BS THEN SHOOT: PLOT 8,12,N$+A$ 

: PRINT SPC(9)3;"Press Y to continue"; 

: REPEAT:GET G$:UNTIL 6$="Y" 


NEXT 

GOSUB SPELL:PLOT 15,3," * 

PRINT SPC(8)s"You got “sSC3;"out of 10" 
PRINTSPRINT ES+"L"+E$+"B Another go? Y or N" 


REPEAT:GET G$: UNTIL G$="Y" OR GS$="N" 

IF 6$="Y" THEN RUN 
CLS:PRINT "Bye for now. ":END 
REM ## SPELL *# 
CLSsPRINT:PRINT S$:PRINT D$+E$+"A"s PRINT: PRINT 
PLOT 15,3,CHR$(8)+"WORD"+STR$(1) 
RETURN 

REM ## SET UP ## 

MAX=-1:DIM R$(100) 

REPEAT: MAX=MAX+1:READ R#(MAX) UNTIL R#(MAX)="#" 
N$="No, the answer is “ 

RETURN 

DATA TABLE,CHAIR,BOOK,PILLOW,CUBE,RULER, ISLAND 
DATA GLASS, BUCKET, TORCH, KITCHEN, BOTTLE, TISSUE 
DATA SLEEPING, RUNNER, MISS,RUBBER,TYRE,PERSON 
DATA PLASTIC, BANANA, GLOVE, BALLOON, BEGIN, PLEASE 
DATA MEAT, TREAT ,MAID,SAID,BACK,FLOWER,CUPBOARD 
DATA PLATE, BOXES,GHOST,LOVELY,PADDLE, CHURCH 


1168 DATA SLEEP,SOLDIER, MONDAY, TUESDAY, WEDNESDAY 
1178 DATA BEDROOM, HELLO,SUNNY,PAPER,CHAIN, TWENTY 
1188 DATA THURSDAY ,UPWARDS,SELECTION,CIRCUS,PERSON 
1198 DATA MAGIC,LETTER, JUNGLE, INNOCENT, INJURY 

120@ DATA INFLUENCE, INCIDENT ,HORROR, GRAMMAR, GRAND 
1210 DATA FRINGE, VACATE, TRIAL, TREND, STARTLE 

122@ DATA REVEAL,QUIET,PROPERTY,POLICE,POISON 

1998 DATA * 

2000 REM ** INFOrmation ## 

2018 PAPER O@: INK 7:E$=" "4CHR$(27) :DS$=E$+"J"+CHR$ (4) 


2020 S$=D$+ES$+"A SPELL IT" 
2038 GOSUB SPELL:PLOT 15,3," : 
2048 PRINT D$+E$+"A by Czes Kosniowski" 


2058 PRINT D$:PRINT: PRINT: PRINT 

2068 PRINT "A word will be flashed on the screen. " 
2078 PRINT “Look carefully, then SPELL IT out! "sPRINT 
2080 PRINT:PRINT “How fast? 1 (fast) to 9 (slow) "; 
2098 REPEAT: G$=KEY$:GG=RND(1):UNTIL G$>"@" AND GE<":" 
2108 T=10#VAL(G$) 

2118 PRINT:PRINT: PRINT SPC(18)3"0.K. - get ready." 
212@ RETURN 


The main routine 


A word is chosen at random from the list in the program. Two PINGs later 
the word is flashed on the screen (in double height characters). The 
computer then waits for you to type that word. This is followed by an 
appropriate comment. 

This process is repeated ten times after which the score out of ten is given. 


The subroutines 


500 SPELL 
This is used to refresh the screen after a word has been flashed. 


1000 SETUP 

The words are stored in the string array R$(1). You may add words to this 
list if you like. If the total number of words exceeds 100, change the 
DIMension statement in line 1010. 


2000 INFO 
This contains brief information about the game. It is also used to find out 
how quickly you want the words to be flashed on the screen. 


85 


20 Sketch Pad 


Display your artistic abilities with this simple but effective sketch pad. You 
can draw lines horizontally, vertically or diagonally. The lines you draw 
may be visible or invisible, the choice is yours. 

Use the cursor keys to move left, right, up or down. To draw diagonally 
use the following keys: 


1 for diagonally up-left _\ for diagonally up-right 
Z for diagonally down-left / for diagonally down-right 


Pressing the I key toggles the visibility/invisibility and consequently 
determines whether the line you are drawing is visible or not. 

To quit press @. 

If you want to save any of your creations onto tape you'll have to add a 
few extra lines to the program. See Appendix 1 for further details. 





86 


10 REM HHXHHHHHHHHS 
28 REM * SKETCH PAD 
3Q REM HHHHHHHHHEHERE 
40 REM 

5@ SETUP=408: INFO=608 


108 REM *#* THE MAIN PROGRAM ## 

118 GOSUB INFO:G0SUB SETUP 

128 REPEAT 

13@ : CURSET X,Y,2 ‘Displays current position 

14@ : GET G$:G=ASC(G$) 

158 : A=(G=8)-(6=9) -(G=92) + (G=49) - (6=47) + (6=98) 

160 : B=(G=11)-(6=10)+(G=92) +(G=49) - (G=47) -(6=98) 

17@ : CURSET X,Y,@ ‘Erases current position 

18@ : IF X+A>239 OR X+A<@ THEN A=@:PING 

198 : IF Y+B>199 OR Y+B<@ THEN B=@:PING 

200 : U=X:V=¥:X=X+A: Y=¥+B 

218 : IF G=73 THEN FB=-NOT-FB 

220 : IF NOT ((A=@) AND (B=@)) THEN CURSET U,V,FB 

238 : Z=FRE(1) 

248 UNTIL G=81 

250 TEXT:E$=" "+CHR$(27) 

260 PRINT E$+"B"+E$+"LAnother go? Y or N":PRINT 

278 REPEAT:GET G$:UNTIL G$="Y" OR G$="N" 

280 IF G$="Y" THEN RUN 

290 CLS:PRINT "Bye for now. ":POKE #26A,3:END 

400 REM *## SET UP #+# 

41@ X=119:Y=99:FB=1:HIRES 

420 POKE #24A,18 ‘Disables cursor and click 

430 PRINT “Use cursor keys and 1, \, Z or /." 

440 PRINT:PRINT “I - Draw on/off. Q - quit."; 

45@ RETURN 

600 REM ## INFOrmation ## 

618 INK 6:PAPER @:CLS:PRINT 

620 ES=" "+CHR$(27) : DS=E$+"J"+CHR$ (4) 

63@ PRINT D$;SPC(18); "SKETCH PAD":PRINT D$sPRINT: PRINT 
64@ PRINT D$;SPC(6);"by Czes Kosniowski":sPRINT D$:PRINT 
658 PRINT “Draw a picture with this sketch pad. "s:PRINT 
668 PRINT “Use the cursor keys for left, right," 

678 PRINT “up and down. Also, use” 

68@ PRINT “1 for up-left, \ for up-right," 

698 PRINT "Z for down-left and / for down-right":PRINT 


87 


788 PRINT "To draw an invisible line press I," 
71@ PRINT “pressing I again draws visible lines. " 
720 PRINT "Press @ to quit. ":PRINT 


738 PRINT E$+"B"+E$+"L Press Y to start." 
740 REPEAT: GET G$: UNTIL G$="Y" 
75@ RETURN 


The main routine 


The main program waits for a key to be pressed. If one of the movement keys 
is pressed then the direction of movement (A,B) is calculated. If the point at 
(X+A, Y+B) is still on the screen then it is plotted. If the I key is pressed the 
value of FB changes from 1 to 0 and vice versa. This determines whether the 
point plotted is visible or not. 


The subroutines 

400 SETUP 

This initializes the variables and displays brief details of what the various 
keys do. 


600 INFO 
This provides some brief details about the program. 


88 


24 Bounce Away 


Here’s your chance to bounce a ball around the screen with a small bat. You 
can move this bat with the left and right cursor keys. The screen is set up 
with a number of rows of coloured squares. Each time the ball hits a 
coloured square it bounces off and the coloured square disappears. The 
object is to bounce the ball around until it reaches the top of the screen. The 
ball bounces off the sides, the coloured squares and your bat. To add to the 
fun there are a number of other obstacles which slowly disappear. 


You have 7 chances. 





89 


10 REM 4HHHHHHEHHHRHRERHERE 

20 REM *## BOUNCE AWAY #+# 

3O REM HHHHHEHHEHERHEHEHE 

4@ REM 

50 MISS=500:FINISH=600: SETUP=1000: INFO=2000 ° 
10@ REM *# THE MAIN PROGRAM ## 

11@ GOSUB INFO:GOSUB SETUP 

128 REPEAT 

130 : PLOT X,Y,32:X=X+DX:Y=V+DY:PLOT X,Y,1264 
148 : IF X<2 OR X>37 THEN DX=-DX:PING 

15@ ; V=V¥+DY:W=SCRN(X,V) 

160 : IF W>32 THEN DY=-DY:PING 

17@ : IF W=4127 THEN PLOT X,V,32 

18@ : IF V>25 AND W<33 THEN GOSUB MISS 

19@ : IF V<i THEN GOSUB FINISH 

200 : IF Z>@ AND PEEK(769)=223 THEN Z=Z-1:PLOT 2,26,B¢ 
21@ : IF Z2<35 AND PEEK(769)=127 THEN Z=Z+1:PLOT Z,26,B$ 
220 UNTIL STATE<1 

230 PRINT E$s"B"SE$3"L Another go? Y or N" 
248 REPEAT:GET G$: UNTIL G$="Y" OR G$="N" 

258 TEXT: IF G$="Y" THEN RUN 

260 CLS:PRINT “Bye for now. ":POKE #26A,3:END 
5@@ REM *#* MISS ## 

51@ EXPLODE: STATE=STATE-1:DY=-DY:WAIT 100 

92@ PLOT X,Y,32:PLOT Z,246," " 

53@ PLOT 19,8,MID#(STR$¢(STATE) ,2)+" chances. " 
548 IF STATE=1 THEN PLOT 27,8,". “ 

55@ X=10+FNR(20):Z=X: DX=2#FNR(2) -1 

568 PLOT X,Y,126:PLOT Z,26,B$ 

578 RETURN 

60@ REM ** FINISH ¥# 

610 PING: WAIT S@:PING: WAIT 5S@:PING 

620 PLOT 13,1,CHR$(6)+CHR$(12)+"WELL DONE" 

638 WAIT 10@:STATE=-1 

648 RETURN 

1000 REM ## SET UP #+# 

1018 CLS: INK 7:PRINT SPC(9);"You have "; 

1828 PRINT MID$(STR#(STATE) ,2);" chances." 
1038 FOR I=1 TO SKILL:PLOT 0,2#1,1:NEXT 

1048 A$="";FOR I=1 TO 38: A$=A$+CHR$(255) : NEXT 
1050 PRINT: FOR I=1 TO SKILL:PRINT A$:NEXT 


90 


1060 PLOT @,26,9:Y=25: X=1O+FNR (28): Z2X 

1078 BS=CHRS$ (9) +" #88 " 

1088 DX=2#FNR(2)-1:DY=-1:PLOT X,Y,126:PLOT Z,26,B$ 
1090 FOR I=8 TO 15 

1100 : PLOT 2+FNR(34) ,2#SKILL+3+FNR(4) ,96 

1118 NEXT 

112@ RETURN 

2000 REM #* INFOrmation #+# 

2010 INK S:PAPER @:CLS:DEF FNR(X)=INT(RND(1) #X) 

2020 ES=" “+CHR$ (27): DS=E$t+"J"+CHRS$ (4) s PRINT 

2038 PRINT D$;SPC(9)3;"BOUNCE AWAY":PRINT D$:PRINTsPRINT 
2048 PRINT D$;SPC(6);"by Czes Kosniowski":PRINT D$:PRINT 
2050 PRINT "Use the left and right cursor keys to" 
2060 PRINT “bounce the ball around. The obstruc-" 
2078 PRINT "tions slowly disappear until the ball" 
2088 PRINT “can reach the top.":PRINT 

2098 PRINT “What skill level would you like to" 

2108 PRINT “play at? i(easier) to 4(harder) "3 

2118 REPEAT: G$=KEY$:GG=RND(1):UNTIL G$>"@" AND G$<"5" 
2120. SKILL=2+VAL(6$):STATE=13-SKILL:POKE #246A,18 

2138 RETURN 


The main routine 


The main routine moves the ball around and checks which obstacle, if any, 
is present. 

PEEK(769) reads the keyboard. If the value is 223 then the left cursor has 
been pressed and the bat is moved to the left. If it is 127 then the right cursor 
key has been pressed and the bat is moved right. 


The subroutines 


500 MISS 
If the ball doesn’t hit the bat then this subroutine makes the necessary 
noises and updates the data. 


600 FINISH 
If the ball has reached the top of the screen then this subroutine makes the 
necessary noises and displays the WELL DONE message. 


1000 SETUP 
This prints the display and plots a few random obstacles. 


2000 INFO 
This subroutine contains a brief outline of the game. 


91 


?5 Spirals 


This is a short program demonstrating the drawing of spirals on the HIRES 
screen. 

After the initial setting up of variables, several spirals are drawn at 
random. To draw a spiral you need to plot points of the form: 


(XMID + Z*COS (Z),YMID + Z*SIN (Z)) 


for values of Z between 0 and some value such as 5*PI. The point 
(XMID,YMID) is the centre of the spiral. 





92 


10 REM HH#HHHHHHHHE 


20 REM * SPIRALS # 
3Q REM HHHRHHHHEES 


40 REM 


108 
110 
120 
130 
148 
158 
200 
218 
220 
238 
248 
258 
268 
270 
280 
298 
300 
318 
320 
330 
348 
358 
368 
378 
388 
398 


REM *#* SET UP ## 

INK 6:PAPER @:CLS:DEF FNR(X)=INT(RND(1) #X) 

E$=" "+CHR$(27) : D$=E$+"I"+CHR$ (4): PRINT 

PRINT D$;SPC(11)3"SPIRALS":PRINT D$s:PRINT: PRINT 
PRINT D$;SPC(4)3"“by Czes Kosniowski":PRINT D$: PRINT 
PRINT “Just some random colourful spirals." 

REM **# Plotting ## 

WAIT 2@@0:HIRES:POKE #26A,2 

PRINT SPC(14)3 "SPIRALS" 

FOR Y=@ TO 199:CURSET @,Y,3:FILL 1,1,FNR(7) +13 NEXT 
FOR I=@ TO 9 

: XMID=FNR(175) +40: YMID=FNR (148) +26 

FOR Z=@ TO 15+FNR(1@) STEP .t 

CURSET XMID+Z#COS(Z) ,YMID+Z*SIN(Z) ,1 

: NEXT 

NEXT 

PING 

FOR [=@ TO 5 

: FOR Y=@ TO 199:CURSET @,Y,isFILL 1,1,FNR(7)+1:NEXT 
NEXT 

WAIT S@:PING:FOR I=1 TO Ss INK IT:WAIT 75:NEXT 

E$="  "+CHR$(27) 

PRINT E$+"B"+E$+"L Another go? Y or N" 

REPEAT: G$=KEY$:GG=RND(1):UNTIL 6$="Y" OR G$="N" 
TEXT: IF G$="Y¥" THEN RUN 

CLS:PRINT “Bye for now. ":END 


93 


26 Knees up Mother Brown! 


An old favourite song, known to many. If you don’t know the words you 
soon will. As each note is played the corresponding word, or part word, 
appears on the screen. If you know the words then you can watch the man 
doing his exercises, jumping up and down in time to the tune. The tune is 
played in several keys. 





KNEES UP MOTHER BROWN! 











@ just been _to a ding-dong 
n dear old Hrixton_way 

Mother Brown the Pearly Queen’s 
undred years today 

what a celebration! 

er lah-di-dah! 


Ma 
Ooh! knees up Mother Brown 
knees up Mother Brown 
Under the table eae must go 
Ee-i-ee-i-ee-i-oh! | 
If I catch you panei Og 
I’1l saw your leq right off 
So knees up knees up * 
Don’t let the breeze up 
Knees up Mother Brown! 







--ToOs< 



















94 


10 REM EEHHREREREREEEEREEE EEE REE E 
20 REM * KNEES UR MOTHER BROWN! +# 
3O REM HHEHRHRHHHRH HEE H EERE RERERER 
48 REM 

5@ SWITCH=300: INFO=508: CHR=808 


108 
118 
120 
138 
148 
158 
168 
178 
180 
198 
200 
218 
220 
230 
248 
258 
268 
308 
318 
320 
338 
588 
518 
528 
538 
548 
55@ 
568 
578 
588 
598 
608 
618 
628 
638 
640 


REM *## THE MAIN PROGRAM ## 
60SUB INFO 
REPEAT 
PLOT 35,Y," ":PLOT 35,Y+!," . 


: IT=I+i:1F I>MAX THEN GOSUB SWITCH 

: B=INT( (ACI) -1)/12)2Y=25-A(1) :K=NOT K 

: PRINT C$(1); 

: PLOT 35,Y,CHR$(J-1) +A$(-K) 

: PLOT 35,Y+1,CHR$(J-1) +B$(-K) 

: IF AC(I)>@ THEN MUSIC 1,J3+B,A(I)-12#B,@:PLAY 1,@,1,L 
: WAIT 7#T(T) 

UNTIL KEY$="Q" 

PLAY @,8,8,@8:PRINT 

PRINT ES; "B"SE$5 "L Another go? Y or N"sSPC(1@) 
REPEAT: GET G$: UNTIL G$="Y" OR G$="N" 

IF 6$="Y" THEN RUN 

CLS:PRINT “Bye for now.":POKE #26A,3:INK 7:END 
REM *## SWITCH ## 

T=@:CLS:PRINT: PRINT D$3SPC(4)3K$:PRINT D$sPRINT: PRINT 
J=J+i:IF J>5 THEN J=3 

RETURN 

REM ## INFOrmation ## 

INK SsPAPER @:CLSsDEF FNR(X)=INT(RND (1) #X) 

E$=" "“4+CHR$(27) : D$=E$+"I"+CHR$ (4) PRINT 

K$="KNEES UP MOTHER BROWN!" 

PRINT D$;SPC(4)3K$:PRINT D$: PRINT: PRINT 

PRINT D$;SPC(6)3;"by Czes Kosniowski":PRINT D$:PRINT 
PRINT “Just a simple tune......"sPRINT 

PRINT “and some words..ceeseeee "SPRINT 

PRINT “Press Y to start.ccseeee"§ 

REPEAT:GET GS: UNTIL G$="Y" 

PRINT:PRINT: PRINT “Press @ vy quit. “sPRINTs PRINT 
FOR J=@ TO 1 

: A$(J) =CHRS$ (38-3) +CHR$(96-J) 

: BS(J)=CHR$(124-J) +CHR$(126-J) 

NEXT 


95 


658 
668 
678 
680 
690 
700 
710 
728 
738 
748 
750 
760 
770 
780 
798 
888 
818 
828 
1800 
1818 
1820 
1830 
1048 
1050 
1048 
1078 
1080 
1090 
110@ 
1118 
1120 
1130 
1148 
115@ 
1148 
1178 
1180 
1190 
1280 
1218 
1228 


96 


PRINT D$+A$(@)+" “+A$(1):PRINT D$ 
PRINT D$+B$(0)+" "+B$(1):PRINT D$ 
START=#B400+37%8: AA=#A008 

POKE AA,2:IF PEEK(AA)<>2 THEN START=START-#8008 
GOSUB CHR 
START=START+8:GOSUB CHR: START=START+57%#8:GOSUB CHR 
START=START+8: GOSUB CHR: START=START+27#8:GOSUB CHR 
FOR J=@ TO 2:START=START+8:GOSUB CHR: NEXT 

DIM A(120),T(128) ,C$(120)sMAX=-1:WMAX2-1 

REPEAT: MAX=MAX+1:READ A(MAX), T(MAX) UNTIL A(MAX) =-1 
REPEAT: WMAX=WMAX+1:READ C$(WMAX) UNTIL C$(WMAX) ="-1" 
IF MAX<>WMAX THEN PRINT “Error in Data.":END 
MAX=MAX-1:CLS:POKE #246A,1@:INK 6 

J=2: K=O: [=MAX: Y=13:L=2508 

RETURN 
REM ** CHR ## 

FOR I=START TO START+7:READ R:POKE I,R:NEXT 
RETURN 

REM ** DATA ## 

REM DATA - Characters 

DATA 3,3,3,1,1,7,11,19 

DATA 3,3,35,17,9,7,3,3 

DATA 32,32,32,0,0,48,40,36 

DATA 32,32,34,4,8,48,32,32 

DATA 35,3,2,2,2,2,2,2 

DATA 3,3,2,4,8,16,32,8 

DATA 34,32,32,32,32,32,32,32 

DATA 32,32,32,16,8,4,2,8 

REM DATA - Notes 

DATA 8,2,10,2,8,2,7,2,8,2,13,2,13,4,5,2 

DATA 6,2,5,2,4,2,5,2,8,6,5,2,8,2,10,2,8,2,6,2 
DATA 5,2,6,2,8,2,13,2,15,2,13,2,12,2,10,2 

DATA 8,46,8,2,18,2,8,2,7,2,8,2,13,2,13,4,13,2 
DATA 12,2,7,2,8,2,10,2,12,6,8,2,3,2,5924752,8,2 
DATA 10,2,12,2,13,2,10,2,15,2,13,2,12,2,10,2 
DATA 8,2,8,4,8,2 

DATA 5,2,8,2,8,2,8,2,8,8,6,2,10,2,18,2,10,2,18,8 
DATA 12,1,12,1,12,2,12,2,12,2,10,2,9,2,8,4 

DATA 12,2,12,2,12,2,12,2,180,2,9,2,8,4 

DATA 5,2,8,2,8,2,8,2,8,2,8,4,14,2,15,2,10,2,18,2 
DATA 10,2,18,6,11,2,12,2,12,2,10,2,8,2,12,2,12,1 


1230 DATA 12,1,10,2,8,2,8,2,8,2,10,2,12,2,13,6,8,2,8,8 
124@ DATA -1,-1 

125@ REM DATA - WORDS 

1268 DATA I've ,just ,been ,to ,a ,ding-,"“dong . 
1278 DATA down ,dear ,old ,Brix,ton ,“way , 
1288 DATA Old ,Mot,her ,Brown ,the ,Pearl,y ,"Queen‘s * 
1298 DATA a ,hun,dred ,years ,to,"“day : 
1308 DATA Oh! ,what ,a ,cel,e,bra,"tion! 7 
131@ DATA was ,prop,er ,lah-,di-,“dah! . 
1328 DATA Un,til ,they ,roll‘d ,the ,car,pet ,"up * 
1338 DATA and ,shou,ted ,Nah ,then ,"Ma "4 
1348 DATA Ooh! ,knees ,up ,Moth,er ,"Brown . 
1350 DATA knees ,up ,Moth,er ,"Brown " 
136@ DATA Un,der ,the ,tab,le ,you ,must ,"go " 
1378 DATA Ee-,i-,ee-,i-,ee-,i-,"oh! . 
138@ DATA If ,I ,catch ,you ,bend,"ing - 
1398 DATA I‘ll ,saw ,your ,leg ,right ,"off . 
1408 DATA So ,knees ,up ,knees ,"“up . 
1418 DATA Don’t ,let ,the ,breeze ,"“up : 
1428 DATA Knees ,up ,Moth,er ,Brown! , , 

1430 DATA -t 


The main routine 


The main routine plays each note, displays the words and the jumping man. 
Press Q to quit the program. 

The man is made up out of four characters, two held in A$(1) and two in 
B$(1I). He has two physical appearances depending on whether I is 0 or 1. 

The notes are stored in the array A(1) with time intervals in T(1). The 
words are stored in C$(I). 

See Appendix 4 for further details about MUSIC. 


The subroutines 


300 SWITCH 
When the song has finished the screen is refreshed. A new key for the tune 
is also selected. 


500 INFO 
This contains brief details about the program. 

Eight custom characters are created. When used in groups of four at a 
time a large man appears. The man can appear in one of two states. 


97 


After the creation of the special characters the DATA for the tune and 
words is read in. Be very careful when typing the DATA for the words, as 
each space is important. An extra space (or a missing space) could ruin the 
display. In general, string DATA may or may not be enclosed in quotation 
marks. The last bit of DATA in each DATA statement has been enclosed in 
quotation marks to ensure that the right number of spaces appear. In two of 
the DATA statements there is a comma at the end of the line, this simply 
means that the next bit of data is the empty string. 


800 CHR 


This subroutine reads the DATA for the custom characters and POKEs it 
where needed. 


98 


27 Memory Cards 


Here is a program which may sharpen your memory. It is a game for two 
players and essentially consists of 22 pairs of cards with the letters A to V on 
them. The letters are not visible. When it is your turn you may turn over any 
two cards to reveal the letters. If the letters are the same you receive both 
cards and turn over two more cards. Otherwise, the cards are turned back 
and the next person has a turn. Play continues until all the cards have gone. 
The player with the largest collection wins. 

‘In fact there are 45 cards, 22 pairs and an odd card with the symbol a on it. 
This odd card cannot be matched. 

A card that is flashing may be turned over by pressing Y. Use the cursor 
keys to change the card that is flashing. 






MEMORY CARDS 


Hees: HB ss HBB sc 
Hee REE 2: HEB ss: ii EE ti itt 
tat RG ate Hae ge Eat ny ate at 
Hee HEE HEE ::: GHB ss: GHB sc: He 
GH RRE sc EERE cc EEE a 


RED PLAYER BLUE PLAYER 


















99 


18 
28 
38 
40 
58 
40 
108 
118 
128 
130 
148 
158 
168 
178 
180 
198 
208 


210 : 


228 


230 : 


248 
258 


268 : 


270 
288 
290 
308 
318 
320 
330 
348 
358 
368 
3708 
388 
508 
518 
528 
538 
548 


100 


REM HHKRHHEEHHEREHES 
REM # MEMORY CARDS * 
REM HHEKERHH HERE EERE 
REM 
CHANGE=500: MOVE=400: YES=708: VIEW=800: BACK=900 
SETUP=100@:INFO=2000 * 

REM ** THE MAIN PROGRAM *# 

GOSUB INFO:GOSUB SETUP 

REPEAT 


: PLOT X(M),24,8:PING: WAIT 3@:PING 
: M=-NOT-M:PLOT X(M),24,12 

: REPEAT 

: 722=12:G0SUB CHANGE: WW=2 

: REPEAT 

: REPEAT: UNTIL KEY$="" 

: REPEAT 

: GET G$:G=ASC(G$) 


UNTIL G>7 AND G<12 OR G=89 

: IF 6>7 AND G<1i2 THEN GOSUB MOVE 

IF G=89 THEN GOSUB VIEW 

> UNTIL WW 

: STATE=TRUE: BS=" tH" 

IF P$(@)=P$(1) THEN GOSUB YES 

: GOSUB BACK 

: UNTIL STATE 

UNTIL SC(O)+SC(1)>21 

CLS:PRINT:PRINT SPC(10);NSePRINT D$ 
PING:PRINT: PRINT "SCORES: ": PRINT: PRINT 
WAIT SQ@:PING: WAIT S@:PING 

PRINT E$;"ARED PLAYER “3SC(O):PRINT:PRINT 
PRINT E$;"DBLUE PLAYER "3SC(1):PRINT:PRINT: WAIT 99 
PRINT ES; "B" 3E$3"L Another go? Y or N" 
REPEAT: GET G$:UNTIL G$="Y" OR G$="N" 

IF G$="Y" THEN RUN 

CLS:PRINT "Bye for now.":INK 7:POQKE #26A,3:END 
REM ** CHANGE #+# 

FOR I=@ TO 2 

: PLOT 44#X+1,4#Y+4+1,22 

NEXT 

RETURN 


608 
618 
620 
630 
648 
658 
668 
670 
708 
718 
720 
738 
748 
758 
808 
818 
820 


830 : 


848 
858 
840 
878 
900 
918 
920 
938 
940 
950 
960 
978 
1000 
1018 
1020 
1838 
1040 
1058 


1848 : 


1070 


1080 : 
1090 : 


1108 


REM #* MOVE ## 
72=8:GOSUB CHANGE 

IF X>@ AND G=8 THEN X=X-1 

IF X<8 AND G=9 THEN X=X+1 

IF Y>@ AND G=11 THEN Y=Y-1 

IF Y<4 AND G=1®@ THEN Y=Y+1 
727=12:G0SUB CHANGE 
RETURN 
REM ¥* YES ## 
PING:SC(M) =SC(M) +1 
PLOT 20#M+8,26,STR$(SC(M)) 
STATE=FALSE:B$="..." 

IF SC(@)+SC(1)>21 THEN STATE=TRUE 
RETURN 
REM *#* VIEW ## 

IF SCRN(4#X+3,4#Y+5)<>35 THEN RETURN 
FOR I=@ TO 2 
PLOT 4#X+2,4#Y+441,A$(X4+9#Y) 
NEXT 
A(WH)=X:B(WW)=V:P$ (WW) =A$(X4+9#Y) 
WW=WW+1 
RETURN 
REM ** BACK ## 

77=8:G0SUB CHANGE: WAIT 100 

IF STATE THEN SHOOT:WAIT 300 
FOR J=@ TO i:FOR I=@ TO2 

: PLOT 4#A(J)+2,4*B(J)+4+1,B$ 
NEXT: NEXT 
PING 
RETURN 

REM *# SET UP ## 

CLS: INK 5:PING 

PRINT:PRINT SPC(10);N$:PRINT D$:PRINT 
FOR I=® TO 4 

: FOR J=@ TO 2 

: PRINT " “sCHR$(8); 
: FOR K=@ TO 8 
: PRINT CHR$(27)+"H###"; 
: NEXT 
PRINT 
: NEXT 


101 


1118 
1120 
1130 
1148 
1158 
1160 
1178 
1188 


1198 : 


12088 
1210 
1220 
1230 
1248 
1258 
1268 
1270 
1288 


1298 : 


1300 
1318 
2008 
2018 
2020 
2038 
2048 
2058 
2048 
2078 
2088 
2098 
2100 
2110 
2120 
2138 
2140 
2158 
2148 
2178 
2188 
2198 


102 


: PRINT 

NEXT 

PRINT E$;"H";E$;"ARED PLAYER ms 
PRINT E$;"H";E$;"DBLUE PLAYER" 

PLOT 8,26,STR$(Q8):PLOT 28,26,STR$#(Q) 
DIM A$(44) 

FOR I=@ TO 22 

: FOR J=8 TO 2 

IF 1>@ THEN A$(2#I-1)=A$(2*I-1)+CHR$ (6441) 
2 AS(2#1)=A$(2#1) +CHRE(64+1) 

s NEXT 

NEXT 

M=@: IF RND(1)<.5 THEN M=i1 
X(O)=2:X(1)=20 

X=FNR(9): Y=FNR(5) 

REM MIXING 

FOR I=@ TO 43 

: PP=FNR(45-I)+1 


TT$=A$ (1) sAS(T)=AS(PP) SAS( PP) =TT$ 
NEXT 
RETURN 
REM *# INFOrmation #+# 


INK 2:PAPER @:CLS:DEF FNR(X)=INT(RND(1) #X) 

E$=" "+CHR$(27) :DS=E$t"JI"+CHR$(4) PRINT 
N$=D$+"MEMORY CARDS" 

PRINT SPC(9)s; NS: PRINT D$:PRINT: PRINT 

PRINT D$3;SPC (6); "by Czes Kosniowski":PRINT D#sPRINT 
PRINT "This is a game for two players. When" 
PRINT “it your turn, you may turn two cards" 
PRINT “over. If they are the same then you" 
PRINT “keep the cards and go again. Otherwise"; 
PRINT “the cards are turned back over and the"; 
PRINT “other player has a go.":PRINT: WAIT 99 
PRINT “The card that is flashing may be" 

PRINT "turned over. Use the cursor keys to" 
PRINT “move about. Then press Y to turn a" 
PRINT "card over. ":PRINT:WAIT 99 

PRINT “Decide now who will be the RED player" 
PRINT “and who will be the BLUE player. ":PRINT 
PRINT:PRINT: PRINT “Press Y to start. “3; 

REPEAT: G$=KEY$:GG=RND(1):UNTIL G$="Y" 


2208 POKE #246A,2 ‘Disables cursor 
2218 RETURN 


The main routine 


The main routine consists of several REPEAT/UNTIL loops. The first one 
provides a means of alternating between the two players and continues until 
all the cards are used up. The next loop continues until a pair of different 
cards appear. The third loop provides a process whereby two cards are 
selected by each player. 


The subroutines 


500 CHANGE 
This is the subroutine which turns the flashing of a card on or off depending 
upon whether ZZ is 8 or 12. 


600 MOVE 
This moves the position of the flashing cards. 


700 YES 
If the two revealed cards are the same then this subroutine is used to remove 
the cards from play. 


800 VIEW 
This subroutine reveals the cards. 


900 BACK 
This subroutine turns any revealed cards back. 


1000 SETUP 
The screen display is created by this subroutine. 

The array A$(1) stores the letter on each card. A short routine randomly 
mixes up the contents of the array. 


2000 INFO 
This contains brief details of the game. 


103 


28 Hangman 


This is the old familiar hangman game but without the hanging part. Instead 
a man is forced to walk up a flight of stairs. As usual you have to work out 
the word that the computer has selected. You are told how many letters 
there are in the word. Each time you enter a letter the computer tells you if 
that letter is in the word or not. If it belongs to the word then it is placed in 
the appropriate position. (All occurrences of that letter are automatically 
displayed.) Whenever you enter an incorrect letter the man walks one step 
up the flight of stairs. At the top of the stairs is a plank — one step beyond 
this and SPLAT! 

Don’t enter the same letter twice — that will cause the man to take one step 
nearer to his doom. 


AE IOYWSN 





104 


10 
20 
38 
40 
58 
68 
100 
110 
120 
138 


140 : 


158 
148 
178 
188 
198 
208 
218 
220 
238 
240 
258 
268 
278 
288 
500 
518 
520 
538 
548 
558 
548 
57@ 
580 
598 
600 
610 
628 
638 
648 


REM HHHHHHHHHEH 
REM # HANGMAN + 
REM HHHHEHHHHHH 
REM 
CHOICE=500: YES=4608: NO=700: WRNG=880 
SETUP=1000: INFO=2008 
REM *#* THE MAIN PROGRAM ## 
GOSUB INFO:GOSUB SETUP 
REPEAT 
: GOSUB CHOICE 
REPEAT 
: REPEAT:GET G$: UNTIL G$>"@" AND GS<"C" 
: PRINT G$;" "3: BLANK=TRUE 
: FOR I=1 TOL 
: IF MID$(B$,1,1)=6$ THEN GOSUB YES 
: NEXT 
: IF BLANK THEN GOSUB NO 
: UNTIL STATE=L OR NUMBERS? 
: PRINT: PRINT 
: IF STATE=L THEN PING: WAIT 1@:PING:PLOT 1,5,12 
: IF NUMBER>9 THEN GOSUB WRNG 
: PRINT E$;"“B"5E$ 3 "L Another go? Y or N" 
: REPEAT: GET G$:UNTIL 6$="Y" OR G$="N" 
UNTIL 6$="N" 
CLS:PRINT "Bye for now."s:INK 7:END 
REM ## CHOICE #+# 
STATE=@:NUMBER=@:CLS:FOR I=8 TO 21sPRINT: NEXT 
BS=R$(FNR(MAX)) :L=LEN(BS) 
PLOT @,1,10:PLOT 1,1,4:PLOT @,2,1@:PLOT 1,2,6 
PLOT @,3,9sPLOT 1,3,3:B=INT(i7-L) 
FOR I=B+2 TO B+2#L STEP 2:PLOT 1,3,44:NEXT 
PLOT @,5,2:PLOT 1,5,@:PLOT 14,5,“WELL DONE" 
FOR I=1 TO 6:PLOT 20-1,10+1 ,LEFT$(C$,1) : NEXT 
PLOT 20,11,LEFT$(C$,2):PLOT 10,17,C$ 
PLOT X(@),Y(@),37: RETURN 
REM #* YES ## 
IF SCRN(B+2*#1,1)>32 THEN SHOOT: WAIT 2@:RETURN 
PING:PLOT B+2#1,1,6$:PLOT B+2#1,2,6$% 
STATE=STATE+1: BLANK=FALSE 
RETURN 


105 


708 

718 

720 

730 

740 

800 

810 

828 

830 

848 

858 

868 

1080 
1810 
1028 
1830 
1048 
1858 
1048 
1878 
1180 
11108 
1120 
1138 
1148 
1158 
1168 
1178 
1188 
1198 
1280 
1218 
1220 
1238 
1248 
1258 
1288 
1298 
1380 
1318 
1328 


106 


REM #* NO ## 
PLOT X(NUMBER) , Y(NUMBER) ,32 
ZAP: NUMBER=NUMBER+1 
PLOT X (NUMBER) ,Y (NUMBER) ,37 
RETURN 
REM ## WRNG ## 
FOR I=i TOL 
: GS=MID$(B$,1,1):B0SUB YES 
: PLOT 22,9+1,32sPLOT 22,10+1,37 
NEXT 
PLOT 21,10+L,"SPLAT"sEXPLODE: WAIT 50 
RETURN 
REM *## SET UP ## 
MAX=-1:DIM R$(100) 
REPEAT: MAX=MAX+1:READ R#(MAX) UNTIL R#(MAX)="%" 
FOR I=@ TO 18:READ X(1I),Y¥(I):NEXT 
START=#B400+37#8: AA=#A008 
POKE AA,2: IF PEEK(AA)<>2 THEN START=START-#8008 
FOR I=START TO START+7:READ R:POKE I,R:NEXT 
RETURN 
REM ** THE DATA ## 
DATA TABLE ,CHAIR,BOOK,PILLOW,CUBE,RULER, ISLAND 
DATA GLASS, BUCKET, TORCH, KITCHEN, TELEVISION, BOTTLE 
DATA BEAN,HELLO,NAME,WHOSE,RUNNER, TWELVE, ZEBRA 
DATA RUBBER,SUNNY ,ENDING,GUESS,CORNER, BUTTERFLY 
DATA ENEMY,FLOWER,ROCKET, ORANGE, YELLOW, BLACK 
DATA NOTHING, WATER, SUNSHINE, CHEAT, BLACKBOARD 
DATA MEAT, TREAT, THEATRE, PURPLE,GREEN,VIOLET 
DATA GRAMMAR ,SCHOOL,SIGN,POST,COAST,CHURCH,PADDLE 
DATA BEDROOM, TISSUE,MISS, TEST, AUGUST ,MOTHER,FATHER 
DATA ANIMAL, DIRTY,BEGIN,HANDLE,UNCLE, SHIP 
DATA ZOOM, TWENTY, SQUASH, SHEET, BEAUTIFUL, JANUARY 
DATA DIAMOND, FEBRUARY ,MARCH,APRIL,JUNE, JULY 
DATA SEPTEMBER, OCTOBER,NOVEMBER, DECEMBER, AUNT 
DATA DRONE, DROP ,NOTICE,OFFER,PATCH,PASTIME 
DATA POWDER, QUIZ,QUIET,SORROW, VOLUME, DAFT 
REM Room for more words 
DATA * 
DATA 12,16,13,16,14,15,15,14 
DATA 16,13,17,12,18,11,19,18 
DATA 20,18,21,18,22,18 


1330 DATA 14,14,4,31,14,14,18,18 

2080 REM ** INFOrmation #*# 

201@ INK 5:PAPER @:CLS:DEF FNR(X)=INT(RND(1)#X) 

2028 E$=" "+CHR$(27) :D$=E$4+"J"+CHR$ (4) s PRINT 

2038 PRINT D$;SPC(12);"HANGMAN":PRINT D$:PRINT: PRINT 
2048 PRINT D$;SPC(6)3“by Czes Kosniowski":PRINT D$:PRINT 
2058 PRINT "Guess the word before the man reaches" 
2068 PRINT “the top and falls off........ "SPRINT 
2070 PRINT "For each incorrect letter the man " 

208@ PRINT "moves one step closer........"8PRINT 
2098 PRINT "Press Y to start. "3 

2108 REPEAT: 6$=KEY$:GG=RND(1):UNTIL G$="Y" 

2118 PRINT:PRINT:PRINT “Here we gow..." 

2128 FOR I[=@ TO 9:C$=C$+CHR$(255) s NEXT 

2138 RETURN 


The main routine 


The main routine waits for a letter key to be pressed (one of the keys A to 2Z). 
This letter is printed at the bottom of the screen. A check is made to see if 
this letter is contained in the selected word. If it is then the subroutine YES is 
called, otherwise NO is used. 

The whole process continues until 10 errors have been made or the word 
has been guessed correctly. 


The subroutines 


500 CHOICE 

This selects a word at random and creates the appropriate screen display. 
The string C$ consists of ten solid blocks (CHR$(255)) and is used to create 
the stairs. 


600 YES 

If the letter selected appears in the word then this subroutine is called to 
display that letter. Notice that if the letter has been selected previously it 
counts as an error. 


700 NO 
A wrongly guessed letter (or duplicated letter) calls this subroutine. The 
effect is to make the man walk up that flight of stairs. 


800 WRNG 
If the word is not guessed the man falls over the precipice and goes SPLAT. 


107 


1000 SETUP 
This reads the words into memory. You can add more words or change any 


quite easily in the DATA statements. 
The path that the man walks up the stairs is stored in the arrays X(1), 


Y(I). 
One custom character, the man, is needed. 


2000 INFO 
This contains brief details of the game. 


108 


29 figure it Out 


In this game the computer will select some numbers. You have to figure out 
what these numbers are using the information supplied by the computer. 
For each guess you will be told how many correct numbers you guessed. A 
cyan coloured marker is used to denote a correct number in the correct 
position. A magenta marker denotes a correct number in the incorrect 
position. 

You are allowed to say how many numbers the computer should select. 
Also you may say in what range each of these numbers should be. For 
example, you may ask the computer to select three numbers between 1 and 
2. That makes a rather easy game. At the other extreme you may ask the 
computer to select nine numbers between 1 and 9. That would be rather 
more difficult. 


FIGURE IT 
1 a 


2 


a 
1 a 
Z a 
a 
a 


121 
ziti 


WELL DONE - you 
Another 





109 


10 REM HHHHHHHEHHHRHR HEHE 

28 REM * FIGURE IT OUT *# 

3D REM HEHHHHHHEHH HERES 

4@ REM 

5@ CHECK=500: ANSWER=70@: SETUP=1000: INFO=2008 

100 REM *#* THE MAIN PROGRAM #+# 

11@ GOSUB INFO:GOSUB SETUP 

12@ REPEAT 

138 : FOR I=i1 TO NUMBER: C$(1I)=A$(1): NEXT 

140 : PLOT 1,0,T#:PING: REPEAT: UNTIL KEY$="" 

i5@ : FOR I=i1 TO NUMBER 

168 : REPEAT: GET G$:UNTIL 6$>="@" AND G$<CHR$(49+RANGE) 
170 : IF G$="8" THEN STATE=TRUE: I=NUMBER 

188 : PRINT G$+" “3; :BS(1I)=6$ 

198 : NEXT 

208 : PING:PLOT 1,0,5$ 

219 : IF NOT STATE THEN GOSUB CHECK 

228 : PRINT: PRINT: TRIES=TRIES+1 

23@ UNTIL STATE 

248 IF STATE<@ THEN GOSUB ANSWER 

25@ IF STATE=1 THEN PRINT W$; TRIES 

268 WAIT S@s:PRINTsPRINT E$#"L Another go? Y or N “ 
270 REPEAT: GET G$: UNTIL G$="Y" OR G$="N" 

288 IF 6$="Y" THEN RUN 

298 CLS: INK 7:PRINT "Bye for now. ":END 

5@@ REM ## CHECK #+# 

51@ X$=""*:Y$="" 

52@ FOR I=i1 TO NUMBER 

530 : IF C#$(I1)=BS(1) THEN X$=X$4+"C ":BS(I)="B":C$(1)="C" 
548 NEXT 

55@ FOR I=1 TO NUMBER: FOR J=1 TO NUMBER 

560 : IF C$(I)=BS(J) THEN Y$=Y¥$+"9 “sBS(J)="B":C$(1)="C" 
57@ NEXT: NEXT 

58@ PRINT DS+FSt"FU+F Se" "+" "+X$S+D$StFSt"E"+VS4D$ 

590 IF LEN(X$)=2*NUMBER THEN STATE=1:PING:WAIT 38:PING 
688 RETURN 

780 REM *#* ANSWER #+# 

71@ PRINT “Was it that hard?":SHOOT 

720 PRINT: PRINT “The answer is :"“:PRINT 

738 FOR I=1 TO NUMBERsPRINT AS$(I)+" “3 eNEXT 


110 


748 PRINT 


75@ RETURN 

1000 REM #* SET UP ## 

101@ PAPER @:INK 2:CLS 

1828 FOR I=i TO NUMBER 

1030 : A$(I)=CHRS$(49+INT(RND(1) #RANGE) ) 

1048 NEXT 

105@ T$=CHR$(12)+"Type "+MID$(STR$ (NUMBER) , 2) 
1068 T$=T$+" numbers, between 1 and “+MID$(STR$ (RANGE) ,2) 
1070 FOR I=@ TO 33:S$=S$+" "sNEXT 

1088 STATE=FALSE:PRINT:PRINT: PRINT N$: PRINT 
1090 W$="WELL DONE - you did it in " 

1108 RETURN 

2000 REM ** INFOrmation #+# 


2018 
2020 
2030 
2040 
2050 
2068 
2078 
2080 
2898 
2188 
2118 
2128 
2138 
2140 
2158 
2168 
2178 
2188 
2198 
2208 
2218 
2228 
2238 
2240 
2258 
2268 
2270 


PAPER @: INK 7:CLS 

FS$=CHR$(27):E$=" "+F$: D$=CHR$ (8) 

NS=E$+"A FIGURE IT OUT" 

PRINT CHR$(4)sPRINT E$+"J"+N$sPRINTs PRINT 
PRINT:PRINT E$+"J"+E$+"B by Czes Kosniowski" 
PRINT CHR$(4):PRINT: PRINT 

PRINT “The computer will select some numbers" 
PRINT “which you have to FIGURE out based on" 
PRINT “the information supplied. The special" 
PRINT “symbol "+F$+"I"+F$+"F("+F$+"H"+F$+"Gappears"; 
PRINT " for every number in"; 

PRINT “its correct position. The symbol"; 

PRINT FSt"I"+F $+" EQ"+F$+"H" +h $+"G" 

PRINT “appears for every correct number in" 

PRINT "the wrong position." 

PRINT:PRINT “If you want to give up - press @." 
PRINT: PRINT 

PRINT “How many numbers do you want the" 

PRINT “computer to choose? 3 to 91 “3 

REPEAT: G$=KEY$:GG=RND(1):UNTIL G$>"2" AND GS$<":" 
NUMBER=VAL (6$):PRINT 6$ 

PRINT:PRINT "How large can each of the numbers be?" 
PRINT “2 to 9: “3 

REPEAT: G$=KEY$:GG=RND(1):UNTIL G$>"1" AND GS<"e" 
RANGE=VAL(G$):PRINT 6¢ 

PRINTSPRINT "O.K. Here we go! “s:WAIT 188 

RETURN 


111 


The main routine 


The main loop waits repeatedly for the required number of numbers to be 
typed in. These numbers are displayed and a check is made, with the 
subroutine CHECK, to see how many are correct. 

The process continues until the correct sequence is guessed or the number 
0 is pressed. Pressing 0 gives you the option of giving up. 


The subroutines 


500 CHECK 

This first checks to see how many of the numbers are both correct and 
correctly positioned. It then checks to see how many of the remaining 
numbers are correct but incorrectly positioned. 


700 ANSWER 
If 0 is pressed the main routine is aborted and this subroutine prints out the 
answer. 


1000 SETUP 
This subroutine randomly selects the numbers you have to guess. 


2000 INFO 

This contains brief details of the game. It also requests how many numbers 
(NUMBER) the computer has to select and the range (RANGE) of these 
numbers. 


112 


30 Don't be Greedy 


If you like dice rolling games then here is one for you. A lot of luck is 
involved but some skill is also needed. 

The game uses two dice which look like ordinary dice except that there 
isn’t a number 1. Instead there is a miserable looking face. 

You play against the computer. The object of the game is to be the first to 
score over 100. The computer and you take turns at rolling the dice. A round 
consists of a series of rolls (at least one but posssibly many). You can stop 
rolling whenever you want by pressing 4. If you get a face then your round 
is over and your score for that round is 0. If you get faces on both dice then 
your round is also over and your total score becomes 0. If no face appears 
then you have the choice of rolling again or passing the dice to the 
computer. If you pass the dice your round is over and the score of that 
round is added to your total score. The computer then goes through a 


ROLLING 
Your go. 
Press @ to stop. 


DON’T BE GREEDY! 


Your score is 56 My score is 27 





113 


similar process, after which it is your turn again. The skill is to decide when 
to stop — just remember don’t be greedy. 
Note: The two dice are rolled randomly and the computer does not cheat. 


10 REM 4HHHHHHHHHHHERHHHE ES 

20 REM * DON’T BE GREEDY +* 

3O REM HEHEHE HEREREREREEES 

40 REM 

5@ YOU=300: ME=500: DICE=700: ADDUP=800: CARRY=900: INFO=1000 


180 
110 
120 
138 
148 
158 
148 
178 
188 
198 
208 
308 
318 
320 
338 
340 
358 
368 
378 
388 
398 
400 
418 
420 
430 
440 
4508 
468 
588 
518 
520 


114 


REM *# THE MAIN PROGRAM ## 
GOSUB INFO: ANSWER=TRUE 
REPEAT 
: IF ANSWER THEN GOSUB YOU 
: IF ANSWER THEN GOSUB ME 
UNTIL NOT ANSWER 
FOR I=@ TO 2:PING:WAIT 30:NEXT 
PRINTSPRINT ES; "B"SE$ 3 "L Another go? Y or N" 
REPEAT: GET G$: UNTIL G$="Y" OR G$="N" 
IF 6$="Y" THEN RUN 
CLS:PRINT “Bye for now.":POKE #26A,3: INK 7: END 
REM *# YOU ## 
STATE=FALSE: M=@:N=0sP=2:SC=YSC:T=8 
PLOT 14,4,“Your go." 
REPEAT 
PLOT 10,4,"Press @ to stop." 


: REPEAT: UNTIL KEY$="" 

: GOSUB DICE: GOSUB ADDUP 

: PLOT 10,4," . 

: PRINT H$+" Your score this round is “+STR$(T) 
: IF NOT STATE THEN GOSUB CARRY 

UNTIL STATE 


YSC=SC+T 

WAIT S@:PRINT H$:PRINT: PRINT J$ 

PLOT 1,28,"Your score is"+STR$(YSC)+" “:WAIT 188 
IF YSC>1@@ THEN ANSWER=FALSE:PRINT H$;3SPC(14) sW$ 
PLOT 14,4," ":;WAIT 5@ 

RETURN 

REM ## ME ## 

: STATE=FALSE: N=@:N=1:P=FNR(28)+15:SC=MSCs T=8 
PLOT 15,4,"My go." 


538 


540: 


958 
568 
578 
58@ 
598 
600 
618 
628 
638 
640 
658 
700 
718 
728 
738 
748 
758 


768 : 


778 
788 
798 
800 
818 
828 
838 
B48 
858 
900 
918 
920 
938 
948 
958 
1008 
1018 
1828 
1830 
1048 
1850 


REPEAT 
GOSUB DICE:GOSUB ADDUP 
: PRINT H$+" My score this round is “+STR¢#(T) 
: STATE=STATE OR (RND(1)<.5+.2*(SC+T<YSC) ) 
: IF SC+T>10@ THEN STATE=TRUE 
: IF NOT STATE THEN PRINT:PRINT SPC(108);Y$ 
: WAIT 25@0:PRINT CHR$(11)+d$ 
UNTIL STATE 
MSC=SC+T:WAIT S@:PRINT H$:PRINT:PRINT J$ 
PLOT 20,20,CHR$(5)+"My score is“+STR$(MSC)+" , 
IF MSC>10@ THEN ANSWER=FALSE:PRINT H$+J$;SPC(15)51$¢ 
PLOT 15,4," . 
RETURN 
REM ## DICE #+# 
PLOT 14,2,"ROLLING" 
REPEAT 
: K=FNR(6)sL=FNR(6) :M=M+tN 

: FOR I=@ TO 2 

: PLOT X,Y+2#1I1,BS(K,1):PLOT X+Z,Y+2#1,BS(L,I) 
NEXT 
UNTIL KEY$="Q" AND P<5S OR M>P 
PLOT 14,2," . 
RETURN 
REM #* ADD UP ## 

IF K=@ OR L=@ THEN ZAP: T=@:STATE=TRUE 

IF K=@ AND L=@ THEN EXPLODE:SC=@ 
S=@:I1F K>@ AND L>@ THEN S=K+L+2:PING 
T=T+§ 
RETURN 
REM ## CARRY on ## 
PRINT: PRINT E$+"LDo you want to roll again? Y or N" 
REPEAT: GET G$: UNTIL G$="Y" OR G$="N" 
PRINT CHR$(11)+J$ 

IF G$="N" THEN STATE=TRUE: RETURN 
RETURN 

REM *## INFOrmation #+# 

INK 3:PAPER @:CLS:DEF FNR(X)=INT(RND(1) #X) 

E$=" "“4CHR$(27) :DS=E$t"J"+CHR$(4) sPRINT 
K$="DON'T BE GREEDY!" 

PRINT D$;SPC(7);K$:PRINT D$:PRINTsPRINT 

PRINT D$;SPC(6)3"by Czes Kosniowski":PRINT D$:PRINT 


115 


1068 
1078 
1088 
1898 
1108 
1118 
1120 
1138 
1140 
1158 
1168 
1178 
1188 
1198 
1208 
1218 
1228 
1238 
1240 
1258 
1268 
1278 
1288 
1298 
1300 
1318 
1328 


PRINT "This game uses two dice. Try to be" 

PRINT “first to get a score of over 100.":PRINT 
PRINT "A round consists of a series of rolls."; 
PRINT "You can stop when you want, BUT you" 

PRINT “must stop if you get a ‘1i' (shown as aface.)" 
PRINT:PRINT “If you get a face then your score for" 
PRINT “that round is @. If you get two faces" 


PRINT “then your total score becomes @.":PRINT 
PRINT “Press Y to start.....0.."3 

REPEAT: G$=KEY$:GG=RND(1):UNTIL G$="Y" 

AS="<C yyy 95 4S BSE"S D7 ECSe = agg gh 
BS(O,8)="<4 <4"sBS(O,1)=" OO ":BS(8,2)="<,,,,4" 
B$(1,8)=" \ "sBS(1,1)=" ":B$(1,2)="\ ; 
B$(2,0)=" \ ":B$(2,1)=" \ “:BS(2,2)2"\ . 
BS(3,8)="\ \ "1B$(3,1)=" "sB$(3,2)="\ \? 
BS(4,0)="\ \ ":BS(4,1)2" \ “:BS(4,2)="\ ‘os 
BS$(5,@)="\ \ "sB$(5,1)="\ \"sB$(5,2)2"\ \ 


X29: Y¥=9:Z212:CLS:POKE #26A,2: INK 5 

FOR I=Y¥-2 TO Y+6:PLOT 0,1,9:NEXT 

PLOT @,4,1:PLOT 0,6,3 

PLOT X-1,Y-1,A$:PLOT X-1+Z,Y-1,A$ 

FOR I#V¥ TO Y+4:PLOT X-1,1,B$sPLOT X-1+2,1,B$:NEXT 
PLOT X-1,¥+5,C$:PLOT X-1+Z,Y+5,C$ 

J$=CHR$ (14) :HS=CHR$(3O)+I$:W$="YOU WIN" 

1$s"T WIN": Y$="I'11 roll again." 

PLOT 9,17,CHR$(4)+K$ 

RETURN 


The main routine 


The main routine is a short loop which terminates when the value of ANSWER 
is FALSE. This is the case when one of the players (you or the computer) 
reaches a score over 100. 


The subroutines 


300 YOU 

This subroutine is used when it is your turn. It consists of a loop which ends 
when you decide to stop the round or when you are forced to stop a round 
because of a face. 


116 


500 ME 
This subroutine is similar to the one above except that it includes a strategy 


for the computer. 


700 DICE 
The actual rolling of the dice is performed here. As you can easily check, it is 


quite random and fair. 


800 ADDUP 
The score during a round is calculated with this subroutine. 


900 CARRY 
This asks if you want to carry on rolling. That is, if you are allowed to. 


1000 INFO 

This contains details of the game followed by the board layout. The strings 
A$, B$ and C$ used correctly produce a square. The string array B$(I,J) 
contains the display that can appear on each dice. For example B$(0,0), 
B$(0,1) together with B$(0,2) produce a face while B$(3,0), B$(3,1) 
and B$(3,2) produce four dots. Note that all these strings are printed on 
the screen using the alternate character set. 


117 


Appendix |: Saving Screen to Tape 


There may come a time when you want to save, on tape, a picture that 
you've created on the screen; particularly if it is a high-resolution picture 
which took a while to draw. You can do this quite easily with the following 
method. 

Suppose that the ORIC is in HIRES mode and your picture is ready. Now 
type one of the following (depending on whether you have a 48K or 16K 
ORIC). 


CSAVE "NAME", A#AQ00,E#BF3F | (48K model) 
CSAVE "NAME",A#2000,E#3F3F © (16K model) 


Then press the RECORD and PLAY buttons on your tape recorder and press 
RETURN on the ORIC. 

To view the picture later, first rewind the tape and adjust the volume to 
the correct level. Make sure that the ORIC is in HIRES mode. Then type one 
of the following, 


CLOAD "NAME" ,A#A000,E#BF3F (48K model) 
CLOAD "NAME" ,A#2000,E#3F3F (16K model) 


press RETURN on the ORIC and PLAY on the tape recorder. Soon you should 
see your picture rapidly reappear on the screen. 

You could incorporate the saving part into any of your programs. At a 
suitable point of the program insert a line with the following command. 


GOSUB 50000 


Also, add the following lines to your program. 


50008 REM ## SAVE UTILITY #+# 

50018 PRINT: PRINT 

58828 PRINT “Do you want the save this picture?" 
5Q@83@ PRINT "Y or Ne “3 

50048 REPEAT:GET G$:UNTIL 6$="Y" OR G$="N" 


118 


50058 
50068 
58878 
50088 
50898 
50188 
50118 
58120 
58138 
50140 
50158 
50168 
58178 


IF G$="N" THEN RETURN 

PRINT: PRINT 

PRINT “Press RECORD and PLAY on your recorder"; 
PRINT CHR$(14@);SPC(10);"Press Y when ready"; 
REPEAT: GET G$:UNTIL G$="Y" 

CSAVE “PICTURE”, A#AQQ0,E#BF3F 

REM Change details above for 16K model 

PRINT: PRINT 

PRINT CHR$(14@);SPC(8)3; "Turn your recorder off" 
PRINT CHR$(140);SPC(11); “and press Y “; 

REPEAT: GET G$:UNTIL G$="Y" 

PRINT: PRINT 

RETURN 


119 


Appendix 27: Renumber Utility 


Whenever you write your own programs or modify others, there comes a 
time when you want to renumber the lines. Here is a short simple program 
that will renumber any block of lines. It will not, however, renumber those 
line numbers that you call within a program. In other words GOTO 999, 
GOSUB 237 etc., will not be changed. The way around this problem (used 
throughout this book) is to use named subroutines in the form GOSUB BLANK 
where the variable BLANK is assigned some value in the first lines of a 
program. Then, after renumbering, you need simply change the value of 
BLANK and the program will work. 

Back to the renumber utility, first of all type in the program and save it 
under a name like RENUMBER. Whenever you write a program CLOAD 
"RENUMBER" first and then type in your program. 

To use the utility type RUN 60000 and press RETURN. You will be asked for 
four numbers as follows. 


Block start, Block finish, Start of new line numbers, Increment. 


Here Block start, Block finish are the first and last line numbers of that part of 
your program you want renumbered. Start of new line numbers is the new 
starting line number and Increment is the amoiint by which you want each 
line to go up (this is usually 10). 

Simply type in the four numbers required, separated by commas, and 
press RETURN. The program will then renumber the required block of lines. 


60000 REM ## RENUMBER #+# 

60018 PRINT "Type in 4 numbers, separated by commas" 
60028 PRINT "Block start, finish, New line no., inc" 
60030 INPUT X,Y,L,I 

66048 S=1283 

608058 REPEAT 

60066 : IF DEEK(S)>=X THEN DOKE S,LsL=L+I 

60076 : S#=DEEK(8-2)+2 

60080 UNTIL DEEK(S)>Y OR DEEK(S) =60008 


120 


Warning: Be careful when using this utility. You could ruin your sanity and 
possibly your program. Make sure that the block you are renumbering still 
fits in between the existing non-renumbered lines. For example, look at the 
following sample program, 


18 REM SAMPLE PROGRAM 
12 FOR I=1 TO 10 


14 PRINT I 
16 PING 
18 WAIT 38 
28 NEXT 


Type RUN 60000 and enter the following numbers: 
12,16,10,10 


This will renumber lines 12 - 16 with the new numbers beginning at 10 and 
having increments of 10. The result becomes: 


18 REM SAMPLE PROGRAM 
1@ FOR I=1 TO 18 


20 PRINT I 
38 PING 
18 WAIT 38 
28 NEXT 


Very strange indeed — but the program still RUNs. 

You can recover your original program by using RUN 60000 and entering 
the following numbers 

10,100,10,2 


Go back to the original program and try RUN 60000 with the following 
numbers: 


10,20,10,0 


The result is as follows: 


121 


1@ REM SAMPLE PROGRAM 
18 FOR I=1 TO 10 


18 PRINT I 
1@ FING 
10 WAIT 30 
1@ NEXT 


Again strange — but it still works. 

Finally go back to the original program and RUN 60000 with the following 
numbers: 

10,20,50,-10 


which produces: 


38 REM SAMPLE PROGRAM 
40 FOR I=1 TO 18 


30 PRINT I 
28 PING 
1@ WAIT 32 
@ NEXT 


This program still RUNs, but try to delete line 10! 
You can have lots of fun creating unusual looking programs. Problems 
usually arise with GOSUB and GOTO statements. Here is an example: 


108 REM ANOTHER SAMPLE PROGRAM 
12 GOSUB 20 

14 PING 

16 WAIT 38 

18 END 

28 PRINT "HELLO" 

22 RETURN 


Renumber this program (RUN 60000) with the numbers: 
10,18,100,200 


The result is shown below. This program will not work. 


188 REM ANOTHER SAMPLE PROGRAM 
308 GOSUB 20 

508 PING 

708 WAIT 38 

900 END 

20 PRINT "HELLO" 

22 RETURN 


Finally, here is the Treasure hunt program renumbered in a strange way. The 
program RUNs but you won't be able to type it in, and trying to edit any line 
becomes difficult. (If you want to renumber your programs in such a 
fashion, renumber the higher numbers first and work down.) 


REM HHERHHHEHE HEHEHE EHS 

REM # TREASURE HUNT * 

REM HHHHHREHHHEHHEEES 

REM 

VIEW=1:SETUP=2: INFO=3 

REM #* THE MAIN PROGRAM # 

GOSUB INFO:GOSUB SETUP 

REPEAT 

: PLOT X,Y,12:GET K#:KK=ASC(K$):PLOT X,Y,8 
IF KK=32 THEN GOSUB VIEW 

IF KK=8 AND X>4 THEN X=X-2 

IF KK=9 AND X<3@ THEN X=X+2 

IF KK=1@ AND Y<22 THEN Y=Y+2 

: IF KK=11 AND Y>2 THEN Y=Y-2 

UNTIL STATE 

SHOOT: WAIT 40:PING: WAIT 48:PING 

PRINT CHR#(14)+E$+"L"3SPC(11); "WELL DONE" 
PRINT E$+"A"+" Another go? Y or N" 
PRINT CHR#(14)+CHR#(11)3:PING 

REPEAT: GET K$:UNTIL K$="Y¥" OR K$="N" 


123 


NOWWWWWWWWWWDnwWwHTnWwWWWdW Ns NnNNNNNNYINN NN NNN NN FY KF Re KF KF ee KH eK SS 


— 
NG 


IF K$="Y" THEN RUN 

CLS:PING:PRINT "Bye for now. ":POKE #26A,3:END 
REM * VIEW # 

IF SCRN(X+1,Y)<>35 THEN RETURN 

DIST=INT (SOR ( (MM-X) # (MM-X) + (NN-Y) #(NN-Y))/2) 
AS=CHR$ (48+DIST) 

IF DIST>9 THEN A¢$="X" 

IF DIST>@ AND RND(1)<¢.5 THEN A$="?" 

PLOT X+1,Y,A$:STATE=DIST=8 

RETURN 

REM * SETUP +# 

CLS:PRINT SPC(11)3 "TREASURE HUNT": PRINT 

FOR I=1 TO ii 

: PRINT SPC(3); 

: FOR J=@ TO 13 

: PRINT CHR$(27)+"H#"s 

: NEXT 

: PRINT: PRINT 

NEXT 

PRINT E$+"A Use cursor keys to move." 
PRINT:PRINT E$+"D Press <Space bar? to view. "; 
PRINT CHR$(11);CHR$(11)3CHR#(11) 

X=16:Y=12 ‘INITIAL POSITION 
MM=2#INT(RND(9) #1441) +2: NN=2#INT(RND(9) #1141) 
STATE=FALSE 

RETURN 

REM * INFOrmation # 

POKE #26A,10 ‘Disables cursor and key click 
INK O@:PAPER 3:CLS:PRINT 

E$=" "“4CHR$(27) sDS=E$+"I"+CHR$ (4) 

PRINT D$;SPC(9); "TREASURE HUNT":PRINT D$ 
PRINT: PRINT 

PRINT D$;SPC(5)3"“by Czes Kosniowski":PRINT D$ 
PRINT:PRINT E$+"A Find the hidden treasure." 
PRINT “By pressing the <space bar> you will" 
PRINT “be told how far away the treasure is" 
PRINT “approximately. Sometimes a ? appears" 
PRINT “to confuse you. An X means that the" 
PRINT "distance is 1@ or more. 600D LUCK" 
PRINT: PRINT E$+"B"+E$+"L Press Y to continue." 
REPEAT: K$=KEY$:K=RND(1):UNTIL K$="Y" 

RETURN 


Appendix 3: The ORIC Characters 


This appendix lists the ORIC standard and alternate character sets together 
with their ASCII values. 


Standard characters 


Gowoe Gow. 


Jom ot 


tl tA 
oN ant Wh 


“Ua aww 
o 


0 


Om Dewy tay 


Tm Oo 


73 
74 
73 
76 
77 
78 
79 


ee uUYy ARON KH KETC CAMA OT 


me th 


nF ow 


oho Oo 


1 
81 
82 
a3 
84 
85 
Bo 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
120 
i@1 
102 
103 


tH TO DOD Se Fee TF 


104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 


125 


Alternate characters 


iB 


74 


tf 


Ww 


meee ea 


“ 


81 


7 
8 
9 
6@ 


61 


wf 6 


4Q 
41 


o 
a 


42 


44 
45 
46 
47 
48 
49 


66 


67 


68 
69 
70 
71 
7 


MM 


11 


38 


2 
= 


94 


i) 


tH 
ie) 


126 


Appendix 4: Musical Notes 


The MUSIC command in the ORIC requires four numbers. 
Channel, Octave, Note, Volume 


Note can take any value from 1 to 12; other numbers produce error 
messages. These numbers correspond approximately to the following notes: 

4 0 2 
F# 8 


C# 5 
G 9 


D 4 
G# 10 


D# 5 E 6 
A 11 A# 12 


F 
B 


iow 
ou 
“ou 
“ou 
"ou 
out 


To play a tune on the ORIC the relevant data has to be fed in, usually via 
DATA statements. Things are relatively easy if you stay in one octave. But 
often you want to move from one octave to another. The use of DATA 
statements to indicate the octave required is rather wasteful. This appendix 
describes a simple way of combining the note and octave values into a single 
number. 

The idea is to use the numbers 1 to 12 for the first octave, the numbers 13 
to 24 for the second and so on. Then one number, say R, is used for both the 
octave and note value, To recover the value OCT of the octave and NN the 
note simply use the following. 


INTCCR - 1)/12) 
R - 12*0CT 


OcT 
NN 


With this scheme you can imagine a piano keyboard as illustrated below. 
Entering music from sheet music becomes easy. 





24 7911 1416 79 81 83 
tt 78|80|82|84 
CDEFGABCDE FGAB 


127 


Of course this is not the whole story. Usually we set the volume control to 
0 and use a command such as 


PLAY 3,0,1,2500 : WAITT 


This essentially controls the way the sound is produced (envelope mode 
etc.) and the time T for which the note is played. Thus our DATA statements 
should contain two numbers R and T. The value of R tells the ORIC which 
octave and note to play, while T tells it how long to play it for. 

The above process will produce acceptable music on the ORIC. You can of 
course be much more adventurous. 


128 


Easy Programming for the BBC Micro £5.95 
Eric Deeson 


‘A well thought out approach to teaching the beginner not only BBC 
Basic but also program design’—BBC Micro User 


Further Programming for the BBC Micro £5.95 
Alan Thomas 

BBC Micro Assembly Language August 1983 
Bruce Smith 

BBC Micro in Education August 1983 
Eric Deeson 

Easy Programming for the Dragon 32 £5.95 


Ian Stewart & Robin Jones 


Further Programming for the Dragon 32 £5.95 
Ian Stewart & Robin Jones 


Shiva Software 


Spectrum Special 1 £5.95 
Ian Stewart & Robin Jones 


A selection of 10 educational games and puzzles 


Spectrum Specials 2 & 3 £5.95 each 
Ian Stewart & Robin Jones 


Plus more to come! 


Other titles of interest 


Easy Programming for the Oric-1 
Ian Stewart & Robin Jones 


Brainteasers for BASIC Computers 
Gordon Lee 


Programming for REAL Beginners 
Philip Crookall 


PEEK, POKE, BYTE & RAM! Basic Programming 
for the ZX81 
Ian Stewart & Robin Jones 


‘Far and away the best book for ZX81 users new to computing’ — 
Popular Computing Weekly 


‘,.. the best introduction to using this trail-blazing micro’— 
Computers in Schools 


‘One of fifty books already published on the Sinclair micros, it is the 
best introduction accessible to all computing novices’—Laboratory 
Equipment Digest 


The ZX81 Add-On Book 
Martin Wren-Hilton 


Machine Code and better Basic 
Ian Stewart & Robin Jones 
‘...a beautifully written course in so-called advanced programming, 


concentrating on program structuring, data-handling and machine 
coding’—Education Equipment 


Easy Programming for the ZX Spectrum 
Ian Stewart & Robin Jones 


‘,.. will take you a long way into the mysteries of the Spectrum: is 
written with a consistent and humorous hand: and shares the affection 
the authors feel for the computer’ —ZX Computing 


Further Programming for the ZX Spectrum 
Ian Stewart & Robin Jones 


Spectrum Machine Code 
Ian Stewart & Robin Jones 


Computer Puzzles: For Spectrum and ZX81 
Ian Stewart & Robin Jones 


‘What a gem of a book! ’—Education Equipment 


Games to Play on Your ZX Spectrum 
Martin Wren-Hilton 


Spectrum in Education 
Eric Deeson 


£5.95 


£4.95 


£2.95 


£4.95 


£5.50 


£7.50 


£5.95 


£5.95 


£5.25 


£2.50 


£1.95 


£6.50 


Can you: 


@ escape from the pack of wolves 
@ pilot.the lunar module 

@ sing ‘Knees Up Mother Brown 
@ tame the snake 


’ 


This collection of 30 programs 
consists of four types of games: pure 
entertainment (using sound and 
colour), puzzles, arcade games and 
thought-provoking problems. 


Included in the useful appendix 
section are: 


@ program to SAVE the screen 

@ renumber utility program 

@ standard and alternate character 
sets 

@ music on the ORIC 


Program listings have all been 
printed directly from bug-free 
RUNning programs. Brief program 
descriptions and screen printouts 
are included. All programs are user- 
friendly and will not. ‘crash’ if 
presented with unexpected inputs. 


A cassette is available containing six 
programs from the book. 


et 
SHIVA 


Shiva Publishing Limited ISBN 0 906812 48 8 UK price £4.95 net 








GAMES TC PLAY ON YOUR ORIC-1  Ezes Kosniowsti